J'ai un byte[]
tableau qui est chargé à partir d'un fichier que je connais contient UTF-8 .
Dans un code de débogage, j'ai besoin de le convertir en chaîne. Y a-t-il une doublure qui fera cela?
Sous les couvertures, il ne devrait y avoir qu'une allocation et une copie , donc même si elle n'est pas implémentée, cela devrait être possible.
Réponses:
la source
System.Text.Encoding.UTF8.GetString(buf).TrimEnd('\0');
.Il existe au moins quatre façons différentes d'effectuer cette conversion.
GetString de l'encodage
, mais vous ne pourrez pas récupérer les octets d'origine si ces octets ont des caractères non ASCII.
BitConverter.ToString
La sortie est une chaîne délimitée par "-", mais il n'y a pas de méthode intégrée .NET pour reconvertir la chaîne en tableau d'octets.
Convert.ToBase64String
Vous pouvez facilement reconvertir la chaîne de sortie en tableau d'octets à l'aide de
Convert.FromBase64String
.Remarque: la chaîne de sortie peut contenir «+», «/» et «=». Si vous souhaitez utiliser la chaîne dans une URL, vous devez la coder explicitement.
HttpServerUtility.UrlTokenEncode
Vous pouvez facilement reconvertir la chaîne de sortie en tableau d'octets à l'aide de
HttpServerUtility.UrlTokenDecode
. La chaîne de sortie est déjà compatible avec les URL! L'inconvénient est qu'il doit êtreSystem.Web
assemblé si votre projet n'est pas un projet Web.Un exemple complet:
la source
var decBytes2 = str.Split('-').Select(ch => Convert.ToByte(ch, 16)).ToArray();
Une solution générale pour convertir un tableau d'octets en chaîne lorsque vous ne connaissez pas l'encodage:
la source
Définition:
En utilisant:
la source
La conversion de a
byte[]
en astring
semble simple mais tout type d'encodage risque de gâcher la chaîne de sortie. Cette petite fonction fonctionne simplement sans résultats inattendus:la source
Utilisation
(byte)b.ToString("x2")
, sortiesb4b5dfe475e58b67
la source
Il existe également la classe UnicodeEncoding, assez simple à utiliser:
la source
UnicodeEncoding
est le pire nom de classe jamais; unicode n'est pas du tout un encodage. Cette classe est en fait UTF-16. La version little-endian, je pense.Alternativement:
la source
Un linq à une ligne pour convertir un tableau d'octets
byteArrFilename
lu à partir d'un fichier en une chaîne terminée par zéro de style C ascii pur serait le suivant: Pratique pour lire des choses comme les tables d'index de fichiers dans les anciens formats d'archive.J'utilise
'?'
comme caractère par défaut pour tout ce qui n'est pas purement ascii ici, mais cela peut être changé, bien sûr. Si vous voulez être sûr de pouvoir le détecter, utilisez-le à la'\0'
place, carTakeWhile
au début, une chaîne construite de cette façon ne peut pas contenir de'\0'
valeurs de la source d'entrée.la source
BitConverter
peut être utilisée pour convertir un fichierbyte[]
enstring
.La documentation de la
BitConverter
classe peut être trouvée sur MSDNla source
À ma connaissance, aucune des réponses fournies ne garantit un comportement correct avec une terminaison nulle. Jusqu'à ce que quelqu'un me montre différemment, j'ai écrit ma propre classe statique pour gérer cela avec les méthodes suivantes:
La raison de cela
startIndex
était dans l'exemple sur lequel je travaillais spécifiquement, j'avais besoin d'analyser un enbyte[]
tant que tableau de chaînes terminées par null. Il peut être ignoré en toute sécurité dans le cas simplela source
byteArr.TakeWhile(x => x != 0)
est un moyen rapide et facile de résoudre le problème de terminaison nulle.hier est un résultat où vous n'avez pas eu à vous soucier de l'encodage. Je l'ai utilisé dans ma classe réseau et j'envoie des objets binaires sous forme de chaîne.
la source
En plus de la réponse sélectionnée, si vous utilisez .NET35 ou .NET35 CE, vous devez spécifier l'index du premier octet à décoder et le nombre d'octets à décoder:
la source
Essayez cette application console:
la source
J'ai vu quelques réponses à ce poste et il est possible d'être considéré comme une connaissance de base complète, car plusieurs approches en programmation C # permettent de résoudre le même problème. Une seule chose qui doit être prise en compte concerne une différence entre Pure UTF-8 et UTF-8 avec BOM .
La semaine dernière, lors de mon travail, j'ai besoin de développer une fonctionnalité qui génère des fichiers CSV avec BOM et d'autres CSV avec UTF-8 pur (sans BOM), chaque type de codage de fichier CSV sera consommé par différentes API non standardisées, celle-là L'API a lu UTF-8 avec BOM et l'autre API a lu sans BOM. J'ai besoin de rechercher les références sur ce concept, en lisant " Quelle est la différence entre UTF-8 et UTF-8 sans nomenclature? " Discussion de débordement de pile et ce lien Wikipedia " Marque d'ordre d'octets " pour construire mon approche.
Enfin, ma programmation C # pour les deux types de codage UTF-8 (avec BOM et pure) devait être similaire à l'exemple ci-dessous:
la source