字节转换为字节转换令人费解的错误

时间:2014-11-24 07:46:04

标签: c# string byte getstring

有人可以帮忙发现错误吗?这是代码:

   byte[] oriBytes = { 0xB0, 0x2D };                       // oriBytes -> 0xB0, 0x2D
   string oriInStr = Encoding.ASCII.GetString(oriBytes);   // oriInStr ->   "?-"
   oriBytes = Encoding.ASCII.GetBytes(oriInStr);           // oriBytes -> 0x3F, 0x2D

我无法取回0xB00x2D的原始字节值。

5 个答案:

答案 0 :(得分:8)

0xB0不是有效的ASCII码。您可以阅读here

  

大于十六进制0x7F的任何字节都被解码为Unicode问号(“?”)

答案 1 :(得分:4)

这是因为看似.NET doesn't support Extended ASCII table。高于127的每个值都会生成?,即63

因此,将?转换回来会产生63

当使用UTF8编码运行代码时,您将看到它转到扩展页面,因为此示例中的newBytes返回4个字节而不是2个字节:

byte[] oriBytes = { 0xB0, 0x2D };
string oriInStr = Encoding.UTF8.GetString(oriBytes);
byte[] newBytes = Encoding.UTF8.GetBytes(oriInStr);

答案 2 :(得分:1)

在你的byte [] 0xB0中更改为176而0x2D更改为45.从ASCII转换后,只有128个字符176将为您提供? (未定义)和45给你 - 。

尝试调试代码并查看发生的情况。

答案 3 :(得分:0)

啊,啊,我明白了!使用Encoding.Unicode而不是ASCII。小心家伙......;)

   byte[] oriBytes = { 0xB0, 0x2D };                         // oriBytes -> 0xB0, 0x2D
   string oriInStr = Encoding.Unicode.GetString(oriBytes);   // oriInStr ->   "?-"
   oriBytes = Encoding.Unicode.GetBytes(oriInStr);           // oriBytes -> 0xB0, 0x2D

答案 4 :(得分:0)

正如其他人所说.Net不支持扩展的ascii。要解决这个问题,你应该将字节值转换为基本为int的char,它将正确映射它们。

 byte[] oriBytes = { 0xB0, 0x2D };                      
 string oriInStr = "";
 for (int a = 0; a < oriBytes.Length; a++)
     oriInStr += (char)(oriBytes[a]);
 oriBytes = Encoding.ASCII.GetBytes(oriInStr);