Comment obtenir une représentation en octets cohérente des chaînes en C# sans spécifier manuellement un encodage ?
Contrairement aux réponses ici, vous n’avez PAS besoin de vous soucier de l’encodage si les octets n’ont pas besoin d’être interprétés !
Comme vous l’avez mentionné, votre objectif est simplement d’« obtenir les octets dans lesquels la chaîne a été stockée ».
(Et, bien sûr, de pouvoir reconstruire la chaîne à partir des octets.)
Pour ces objectifs, je ne comprends honnêtement pas pourquoi les gens continuent à vous dire que vous avez besoin des encodages. Vous n’avez certainement PAS besoin de vous soucier des encodages pour cela.
Faites simplement ceci à la place :
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
// Do NOT use on arbitrary bytes; only use on GetBytes's output on the SAME system
static string GetString(byte[] bytes)
{
char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
}
Tant que votre programme (ou d’autres programmes) n’essaie pas d’interpréter les octets d’une manière ou d’une autre, ce que vous n’avez évidemment pas mentionné vouloir faire, il n’y a rien de mal avec cette approche ! Se soucier des encodages ne fait que compliquer votre vie sans raison réelle.
Avantage supplémentaire de cette approche : Peu importe si la chaîne contient des caractères invalides, car vous pouvez toujours obtenir les données et reconstruire la chaîne d’origine de toute façon !
Elle sera encodée et décodée de la même manière, parce que vous ne faites que regarder les octets.
Si vous aviez utilisé un encodage spécifique, cela vous aurait posé des problèmes avec l’encodage/décodage de caractères invalides.