Pregunta

Estoy trabajando en el puerto serial en la transmisión y recepción de datos para algunas de hardware en 8 bits de datos.Me gustaría guardarlo como cadena para facilitar la comparación, y de preset se almacenan los datos como una cadena de texto o en formato hexadecimal en el archivo xml.Me enteré de que sólo cuando se utiliza la Codificación.Valor por defecto que es la codificación ANSI, a continuación, los 8 bits de datos se convierten correctamente y fácilmente reversible.La codificación ASCII sólo funciona para los 7 bytes de datos, y UTF8 o UTF7 no funciona bien también, ya que estoy usando un cierto carácter de 1-255.De la codificación.Por defecto estaría muy bien, pero he leído en la web de MSDN que es dependiente de la OS de la página de códigos de configuración, lo que significa que puede comportarse de manera diferente en diferentes codepage configurado.Yo uso el método GetBytes() y GetString ampliamente el uso de la Codificación, pero quisiera un failsafe y portátil método que funciona todo el tiempo en cualquier configuración.Cualquier idea o mejor sugerencia para esto?

¿Fue útil?

Solución

Latin-1 también conocido como ISO-8859-1 también conocido como de la página de códigos 28591 es una útil página de códigos para este escenario, ya que los mapas de los valores en el rango de 128 a 255 sin cambios.Los siguientes son intercambiables:

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

El código siguiente ilustra el hecho de que para Latin1, a diferencia de la Codificación.Por defecto, todos los caracteres en el rango de 0 a 255 se asignan de la misma:

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

Otros consejos

¿Por qué no utilizar una matriz de bytes en lugar?Habría que ninguno de los problemas de codificación es probable que sufren con el texto enfoque.

Creo que se debe utilizar una matriz de bytes en lugar.Para la comparación se puede utilizar 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;
}

Utilizar el hebreo de la página de códigos de Windows-1255.Sus 8 bits.
Codificación enc = Codificación.GetEncoding("windows-1255");

Yo missunderstod usted cuando usted escribió "1-255", pensó usted donde refereing a los personajes en la página de códigos 1255.

Usted podría utilizar la codificación base64 para convertir de byte a la cadena y de la espalda.No hay problemas con el código de las páginas o caracteres extraños de esa manera, y que va a ser más eficiente con el espacio de hex.

byte[] toEncode; 
string encoded = System.Convert.ToBase64String(toEncode);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top