74 votes

Comment convertir une chaîne de caractères en tableau d'octets dans .NET ?

J'ai une chaîne de caractères que je dois convertir en un tableau d'octets équivalent en .NET.

Cela devrait être facile, mais j'ai une crampe au cerveau.

99voto

Konrad Rudolph Points 231505

Vous devez utiliser un encodage ( System.Text.Encoding ) pour indiquer à .NET ce que vous attendez comme résultat. Par exemple, dans UTF-16 (= System.Text.Encoding.Unicode ) :

var result = System.Text.Encoding.Unicode.GetBytes(text);

4 votes

Il y a beaucoup plus d'encodages dans System.Text.Encoding que le seul Unicode : assurez-vous de comprendre celui dont vous avez besoin.

1 votes

Joel : C'est pourquoi j'ai écrit "par exemple" ;-) Mais votre remarque est bien sûr valable.

0 votes

:) J'essaie de montrer où se trouvent les encodages non-UTF16 - j'aurais probablement pu mieux le formuler.

41voto

Jon Skeet Points 692016

Déterminez d'abord l'encodage que vous souhaitez : vous devez connaître Un peu d'Unicode d'abord.

Déterminez ensuite quel System.Text.Encoding qui correspond à. Mon Core .NET refcard décrit les plus courants et explique comment en obtenir une instance (par exemple, par une propriété statique de Encoding ou en appelant un Encoding.GetEncoding .

Enfin, déterminez si vous voulez tous les octets en même temps (ce qui est la façon la plus simple de travailler - appelez Encoding.GetBytes(string) une seule fois et le tour est joué) ou si vous avez besoin de le découper en morceaux - dans ce cas, vous devez utiliser la fonction Encoding.GetEncoder puis encoder un bit à la fois. L'encodeur se charge de conserver l'état entre les appels, au cas où vous devriez vous interrompre au milieu d'un caractère, par exemple.

2 votes

@JonSkeet : Vous n'avez pas vraiment besoin de l'encodage à moins que vous (ou quelqu'un d'autre) n'alliez réellement interpréter les octets, n'est-ce pas ? Pour des tâches telles que la compression, le cryptage, l'obscurcissement, etc., l'encodage semble peu pertinent... aucune raison de se donner du mal si ce n'est pas nécessaire...

9 votes

@Mehrdad : Vous absolument faire. Un encodage définit ce que fait la conversion d'une chaîne de caractères en un tableau d'octets. La compression et le cryptage sont deux choses totalement différentes. Sinon, c'est comme dire que le format de l'image n'a pas d'importance lorsque vous voulez enregistrer une image sous forme de fichier. un impliqué, par définition.

0 votes

@JonSkeet : Vous ne pouvez pas dire byte[] bytes = new byte[str.Length * sizeof(char)]; Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length) ? Qui se soucie de l'encodage (ou même de savoir si la chaîne a des caractères valides), tant que vous savez que vous pouvez la récupérer sous la même forme en faisant l'inverse ?

20voto

swilliams Points 19415

Quel encodage utilisez-vous ? Konrad a à peu près tout compris, mais il en existe d'autres et vous pourriez obtenir des résultats bizarres avec le mauvais :

byte[] bytes = System.Text.Encoding.XXX.GetBytes(text)

Dónde XXX peut l'être :

ASCII
BigEndianUnicode
Default
Unicode
UTF32
UTF7
UTF8

8voto

Igal Tabachnik Points 15160

Comme ceci :

    string test = "text";
    byte[] arr = Encoding.UTF8.GetBytes(test);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X