2010-12-03 4 views
2

J'essaye de lire une chaîne terminée par zéro à partir d'un tableau d'octets; le paramètre à la fonction est le codage.Les terminaisons NULL font-elles partie du codage de texte?

string ReadString(Encoding encoding) 

Par exemple, « toto » dans les codages suivants sont:

UTF-32: 66 00 00 00 6f 00 00 00 6f 00 00 00 
UTF-8: 66 6f 6f 
UTF-7: 66 6f 6f 2b 41 41 41 2d 

Si je copiais tous les octets dans un tableau (la lecture jusqu'à la terminaison nulle) et passé ce tableau dans encoding.GetString(), cela ne fonctionnerait pas car si la chaîne était codée en UTF-32, mon algorithme atteindrait le "terminateur nul" après le deuxième octet. J'ai donc une double question: les terminaisons NULL font-elles partie du codage? Si non, comment pourrais-je décoder le caractère chaîne par caractère et vérifier l'octet suivant pour le terminateur null?

Merci à l'avance

(suggestions sont également appréciés)

Edit:

Si "foo" était nulle fin et utf-32 encodée, qui serait-il ?:

1. 66 00 00 00 6f 00 00 00 6f 00 00 00 00 
2. 66 00 00 00 6f 00 00 00 6f 00 00 00 00 00 00 00 
+0

pour votre édition, ce serait "2. 66 00 00 00 6f 00 00 00 6f 00 00 00 00 00 00 00", car utf 32 considère chaque char (même \ 0) comme un tableau de 4 octets – bigworld12

+0

Voici un test rapide utilisant C# interactif: http://i.imgur.com/yvYiTD8.png – bigworld12

Répondre

1

Le terminateur null ne fait pas partie "logiquement" de la chaîne; ce n'est pas considéré comme une charge utile. Il est largement utilisé en C/C++ pour indiquer où la chaîne se termine. Cela dit, vous pouvez avoir des chaînes avec des \ 0 intégrés, mais vous devez faire attention à ce que la chaîne n'apparaisse pas tronquée. Par exemple, std :: string n'a pas de problème avec les \ 0 intégrés. Mais si c_str() et ne tiennent pas compte de la longueur reportée() votre chaîne apparaîtra coupée.

1

Les terminateurs Null ne font pas partie du codage, mais la représentation sous forme de chaîne utilisée par un langage de programmation, tel que C. In .NET, System.String est préfixée par le strin g longueur sous la forme d'un entier de 32 bits et n'est pas à terminaison nulle. En interne System.String est toujours UTF-16, mais vous pouvez utiliser l'encodage pour générer différentes représentations. Pour la deuxième partie ... Utilisez les classes de System.Text telles que UTF8Encoding et UTF32Encoding pour lire la chaîne. Il suffit de sélectionner la bonne fonction de votre paramètre ...

1

Cela semble bien fonctionner pour moi (échantillon de code réel qui lit une unicode, une chaîne vide terminée à partir d'un tableau d'octets):

//trim null-termination from end of string 
byte[] languageId = ... 
string language = Encoding.Unicode.GetString(languageId, 
               0, 
               languageId.Length).Trim('\0'); 
+0

à moins que les données de la chaîne ne commencent par une valeur nulle et contiennent ensuite des erreurs. – ctacke

Questions connexes