Je travaille sur un port série, transmettant et recevant des données sur du matériel à des données 8 bits. Je voudrais stocker en tant que chaîne pour faciliter la comparaison, et les données prédéfinies sont stockées sous forme de chaîne ou format hexadécimal dans le fichier XML. J'ai découvert que seulement en utilisant Encoding.Default qui est le codage ANSI alors les données 8bit sont converties correctement et facilement réversibles. Le codage ASCII ne fonctionne que pour les données 7 bits, et UTF8 ou UTF7 ne fonctionne pas très bien, puisque j'utilise du caractère de 1 à 255. Encoding.Default serait très bien, mais je lis sur MSDN que cela dépend du paramétrage de la page de code du système d'exploitation, ce qui signifie qu'il peut se comporter différemment sur une page de code différente configurée. J'utilise beaucoup GetBytes() et GetString en utilisant le codage, mais je voudrais une méthode à sécurité intégrée et portable qui fonctionne tout le temps à n'importe quelle configuration. Une idée ou une meilleure suggestion pour cela?Encodage .Net 8 bits
Répondre
Latin-1 alias ISO-8859-1 alias codepage 28591 est un codepage utile pour ce scénario, car il mappe des valeurs dans la gamme 128-255 inchangée. Ci-dessous sont interchangeables:
Encoding.GetEncoding(28591)
Encoding.GetEncoding("Latin1")
Encoding.GetEncoding("iso-8859-1")
Le code suivant illustre le fait que pour Latin1, contrairement à Encoding.Default, tous les caractères dans l'intervalle de 0 à 255 sont mis en correspondance inchangée:
static void Main(string[] args)
{
Console.WriteLine("Test Default Encoding returned {0}", TestEncoding(Encoding.Default));
Console.WriteLine("Test Latin1 Encoding returned {0}", TestEncoding(Encoding.GetEncoding("Latin1")));
Console.ReadLine();
return;
}
private static bool CompareBytes(char[] chars, byte[] bytes)
{
bool result = true;
if (chars.Length != bytes.Length)
{
Console.WriteLine("Length mismatch {0} bytes and {1} chars" + bytes.Length, chars.Length);
return false;
}
for (int i = 0; i < chars.Length; i++)
{
int charValue = (int)chars[i];
if (charValue != (int)bytes[i])
{
Console.WriteLine("Byte at index {0} value {1:X4} does not match char {2:X4}", i, (int) bytes[i], charValue);
result = false;
}
}
return result;
}
private static bool TestEncoding(Encoding encoding)
{
byte[] inputBytes = new byte[256];
for (int i = 0; i < 256; i++)
{
inputBytes[i] = (byte) i;
}
char[] outputChars = encoding.GetChars(inputBytes);
Console.WriteLine("Comparing input bytes and output chars");
if (!CompareBytes(outputChars, inputBytes)) return false;
byte[] outputBytes = encoding.GetBytes(outputChars);
Console.WriteLine("Comparing output bytes and output chars");
if (!CompareBytes(outputChars, outputBytes)) return false;
return true;
}
Pourquoi ne pas simplement utiliser un tableau d'octets? Il n'aurait aucun des problèmes d'encodage que vous risquez de subir avec l'approche du texte.
parfois avec série i/o vous voulez envoyer des chaînes de texte entrecoupées de caractères de contrôle. Plus facile à lire si vous utilisez des chaînes. – Joe
@Joe: vous pouvez toujours utiliser ASCIIEncoding pour récupérer la chaîne pour une série d'octets. – user7116
ASCIIEncoding ne fonctionne que dans la plage inférieure de 1-127. – faulty
Vous pouvez utiliser le codage base64 pour convertir des octets en chaîne et inversement. Aucun problème avec les pages de codes ou les caractères bizarres de cette façon, et il sera plus efficace que l'espace hexadécimal.
byte[] toEncode;
string encoded = System.Convert.ToBase64String(toEncode);
-1: comment base64 aide-t-il? – Joe
Parce que l'OP veut une représentation textuelle des données binaires qui est facile à convertir et peut être mis en XML. L'encodage Base64 correspond à la facture. –
Utilisez la page de code hébreu pour Windows 1255. C'est 8 bits.
Encodage enc = Encoding.GetEncoding ("windows-1255");
Je vous missunderstod quand vous avez écrit « 1-255 », où vous pensiez refereing à des personnages dans codepage 1255.
Je travaille sur le système de base anglais – faulty
Je pense que vous devez utiliser un tableau d'octets à la place. À titre de comparaison, vous pouvez utiliser une méthode comme ceci:
static bool CompareRange(byte[] a, byte[] b, int index, int count)
{
bool res = true;
for(int i = index; i < index + count; i++)
{
res &= a[i] == b[i];
}
return res;
}
J'ai besoin de travailler avec de la corde et sa fonction intégrée comme IndexOf, Replace, Split et SubString. Similaire au commentaire de joe sur la réponse de lassevk – faulty
- 1. Py3K RC-1: "LookupError: encodage inconnu: UFT-8"
- 2. Encodage d'un entier au format 7 bits de C# BinaryReader.ReadString
- 3. Hexadécimal à un tableau non signé 8 bits dans VB.NET
- 4. .Net XmlWriter - encodage inattendu me déroutant
- 5. libsox encodage
- 6. Encodage de huffman
- 7. Problème C++ Stuffing 8 bits dans un char
- 8. Chargement PNG 32 bits dans .NET
- 9. Installation de Coldfusion 8 32 bits sur une machine 64 bits - des problèmes?
- 10. Comment convertir un IplImage * OpenCV 8 bits en un IplImage * 32 bits?
- 11. Sérialisation binaire .NET entre OS 32 bits et 64 bits
- 12. Dev .NET 32 bits par rapport à 64 bits prod
- 13. Encodage UTF en Java
- 14. 64 bits smpp library pour .net
- 15. encodage url esperluette émet
- 16. Encodage des caractères spéciaux
- 17. Oracle regex - encodage question
- 18. Bizarre String.getByte (encodage)
- 19. encodage du AuthzSVNAccessFile
- 20. XHTML et & (esperluette) encodage
- 21. Encodage Problème de conversion
- 22. Java, encodage par défaut
- 23. NSLog incorrect encodage
- 24. Asp.net: encodage de chemin
- 25. encodage Querystring Params
- 26. Unicode Encodage et décodage problèmes dans QRCode
- 27. Forcer un service Windows .NET à s'exécuter en 32 bits sur une machine 64 bits
- 28. Comment créer une DLL .NET 64 bits avec l'interopérabilité COM 64 bits?
- 29. Comment exécuter une application .NET 32 bits sur un serveur Windows 64 bits?
- 30. MySQL - Insérer japonais de PHP - Encodage Troubles
Je pense que votre idée était la plus proche. Je vais essayer d'abord. – faulty