2017-07-12 5 views
0

Excuses si cela a été répondu quelque part, mais si c'est le cas, je ne pouvais pas le trouver. Je fais quelques manipulations avec des tableaux d'octets, et j'ai remarqué que lors de la conversion de caractères invalides (par exemple, l'octet 0x9C), il est interprété comme un "?". Par conséquent, quand je le convertis en octet, il sort comme 0x3F.Byte cohérent Représentation des caractères invalides

Mon problème est que les parties des tableaux d'octets sont ASCII, mais d'autres sont des sommes de contrôle qui peuvent contenir des caractères invalides comme celui-ci. Je voudrais être en mesure de convertir l'ensemble du tableau en chaîne pour plus de commodité. Existe-t-il un encodage qui produira ASCII pour les caractères normaux et s'assurera que la conversion d'un caractère invalide en une chaîne et inversement produira le même octet?

Répondre

0

Peut ne pas fonctionner pour d'autres, mais je trouve qu'en utilisant

System.Text.Encoding.Default.GetString(...) 

et

System.Text.Encoding.Default.GetBytes(...) 

par opposition à d'autres encodages a empêché les valeurs dans des tableaux d'octets d'être changé « ? » et les caractères ASCII étaient toujours interprétés correctement.

+0

Il existe toujours des valeurs qui peuvent entraîner l'obtention de données non valides. Si vous avez besoin de représenter un octet [] sous forme de chaîne, vous devez utiliser 'Convert.ToBase64String (' et 'Convert.FromBase64String (' De même, si vous envisagez d'envoyer des données entre les ordinateurs 'System.Text.Encoding.Default' peut être Il suffit de prendre vos sommes de contrôle et d'en faire leur propre byte [] et d'ajouter le texte en base64 à la fin de la chaîne –

+0

La valeur par défaut varie selon les machines, les utilisateurs et l'heure. avoir une chance de travailler dans le contexte de la transformation de va-et-vient décrite dans la question –

+0

Je devrais ajouter, j'ai trouvé le défaut sur ma machine à être System.Text.Encoding.SBCSCodePageEncoding, et j'ai changé le code pour spécifier que Il peut très bien donner des données invalides, mais jusqu'à présent, il fonctionne correctement – Cobalt

0

Vous ne savez pas exactement ce que vous entendez par "caractères normaux", mais vous demandez un codage capable de décoder des séquences arbitraires de valeurs arbitraires d'octets 0-255. Il devrait être pour un jeu de caractères avec 256 points de code, avoir des unités de code de 1 octet, encoder tous les codes dans une unité de code, être dans les bibliothèques de classe .NET Base et le jeu de caractères être un sous-ensemble d'Unicode.

Les normes ISO 8859-1 et CP437 sont deux qui répondent à ces exigences. Vous pouvez vérifier s'ils mappent vos "caractères normaux" aux "caractères normaux" en Unicode. (Indice: ISO 8859-1 a tous les mêmes caractères que le C0 Control and Basic Latin et les blocs C1 Controls et Latin-1 Supplement.)

BTW-êtes-vous sûr que les régions de votre format de données sont codées en ASCII et non en autre encodage de caractères?