2008-09-21 164 views
4

我正在使用串口,​​在8位数据上向某些硬件发送和接收数据。我想将它存储为字符串以方便比较,并且预设数据以字符串或十六进制格式存储在xml文件中。我发现只有在使用ANSI编码的Encoding.Default时,8位数据才能正确转换并且易于翻转。 ASCII编码仅适用于7位数据,而UTF8或UTF7也不适用,因为我使用的是1-255的一些字符。 Encoding.Default会很好,但我在MSDN上读到它依赖于操作系统代码页设置,这意味着它可能在配置的不同代码页上表现不同。我使用Encoding广泛使用GetBytes()和GetString,但希望能够在任何配置下始终工作的故障安全和可移植方法。任何想法或更好的建议呢?.Net 8位编码

回答

13

的Latin-1又名ISO-8859-1又名代码页28591是这种情况下有用的代码页,因为它映射在128-255范围内不变的值。以下是可以互换:

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

下面的代码说明了为Latin1的,不像Encoding.Default,在0-255范围内的所有字符被映射不变的事实:

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; 
} 
串行
9

为什么不直接使用字节数组呢?使用文本方法可能会遇到的任何编码问题都没有。

+0

有时I/o你想发送穿插有控制字符的文本字符串。如果您使用字符串,则更易于阅读。 – Joe 2008-09-21 17:55:48

+0

@Joe:尽管你总是可以使用ASCIIEncoding来检索字节的字节。 – user7116 2008-09-21 17:58:12

+0

ASCIIEncoding仅适用于1-127的较低范围。 – faulty 2008-09-22 02:08:10

-2

您可以使用base64编码将字节转换为字符串并返回。代码页或奇怪的字符没有问题,它会比十六进制更节省空间。

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

-1一起使用:base64如何提供帮助? – Joe 2008-09-21 17:59:42

1

使用Windows-1255的希伯来语代码页。它的8位。
Encoding enc = Encoding.GetEncoding(“windows-1255”);

我missunderstod你,当你写了“1-255”,还以为你在哪里代码页1255

2

refereing字符我认为你应该使用一个字节数组来代替。为了便于比较,你可以使用一些方法是这样的:

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