que number non hace example code characters .net encoding

.net - number - unicode code point



.Net 8-bit Encoding (5)

Estoy trabajando en un puerto en serie, transmitiendo y recibiendo datos a algún hardware con datos de 8 bits. Me gustaría almacenarlo como una cadena para facilitar la comparación, y los datos preestablecidos se almacenan como un formato de cadena o hex en el archivo xml. Descubrí que solo cuando se utiliza Encoding.Default, que es la codificación ANSI, los datos de 8 bits se convierten de forma adecuada y se pueden volver a reproducir fácilmente. La codificación ASCII solo funcionará para datos de 7 bits, y UTF8 o UTF7 tampoco funciona bien, ya que estoy usando algún carácter de 1-255. Encoding.Default estaría bien, pero leí en MSDN que depende de la configuración de la página de códigos del sistema operativo, lo que significa que podría comportarse de manera diferente en diferentes páginas de códigos configuradas. Utilizo GetBytes () y GetString extensivamente usando la Codificación, pero me gustaría un método a prueba de fallos y portátil que funcione todo el tiempo en cualquier configuración. ¿Alguna idea o sugerencia mejor para esto?


¿Por qué no usar una matriz de bytes? No tendría ninguno de los problemas de codificación que probablemente sufrirá con el enfoque de texto.


Creo que deberías usar una matriz de bytes en su lugar. Para comparar puede usar algún método como este:

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; }


Puede usar la codificación base64 para convertir de byte a cadena y viceversa. No hay problemas con páginas de códigos o personajes extraños de esa manera, y será más eficiente en el uso del espacio que el hexadecimal.

byte[] toEncode; string encoded = System.Convert.ToBase64String(toEncode);


Latin-1 aka ISO-8859-1 aka codepage 28591 es una página de códigos útil para este escenario, ya que mapea los valores en el rango de 128-255 sin cambios. Los siguientes son intercambiables:

Encoding.GetEncoding(28591) Encoding.GetEncoding("Latin1") Encoding.GetEncoding("iso-8859-1")

El siguiente código ilustra el hecho de que para Latin1, a diferencia de Encoding.Default, todos los caracteres en el rango 0-255 se asignan sin cambios:

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; }


Use la página de códigos hebrea para Windows-1255. Es de 8 bits.
Encoding enc = Encoding.GetEncoding ("windows-1255");

Te extrañé cuando escribiste "1-255", pensaste que refiriéndote a los personajes en la página de códigos 1255.