有人可以帮忙发现错误吗?这是代码:
byte[] oriBytes = { 0xB0, 0x2D }; // oriBytes -> 0xB0, 0x2D
string oriInStr = Encoding.ASCII.GetString(oriBytes); // oriInStr -> "?-"
oriBytes = Encoding.ASCII.GetBytes(oriInStr); // oriBytes -> 0x3F, 0x2D
我无法取回0xB0
,0x2D
的原始字节值。
答案 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);