C# 字节到字符串到字节的转换令人费解的错误
谁能帮我找出错误吗?代码如下:C# 字节到字符串到字节的转换令人费解的错误,c#,string,byte,getstring,C#,String,Byte,Getstring,谁能帮我找出错误吗?代码如下: byte[] oriBytes = { 0xB0, 0x2D }; // oriBytes -> 0xB0, 0x2D string oriInStr = Encoding.ASCII.GetString(oriBytes); // oriInStr -> "?-" oriBytes = Encoding.ASCII.GetBytes(oriInStr); //
byte[] oriBytes = { 0xB0, 0x2D }; // oriBytes -> 0xB0, 0x2D
string oriInStr = Encoding.ASCII.GetString(oriBytes); // oriInStr -> "?-"
oriBytes = Encoding.ASCII.GetBytes(oriInStr); // oriBytes -> 0x3F, 0x2D
我无法恢复
0xB0
的原始字节值,0x2D
0xB0不是有效的ASCII代码。你可以阅读:
任何大于十六进制0x7F的字节都被解码为Unicode问号(“?”)
在您的字节[]
0xB0
更改为176,而0x2D
更改为45。从只有128个字符的ASCII转换过来时,176会给你什么?(未定义)和45给出-
试着调试代码,看看发生了什么。这是因为.NET显然是一个错误。高于127的每个值都将产生
?
,即63
因此,将?
转换回将导致63
当使用UTF8编码运行代码时,您将看到它进入扩展页面,因为本示例中的newBytes
返回4个字节,而不是2个:
byte[] oriBytes = { 0xB0, 0x2D };
string oriInStr = Encoding.UTF8.GetString(oriBytes);
byte[] newBytes = Encoding.UTF8.GetBytes(oriInStr);
啊哈。。我得到了它!使用
Encoding.Unicode
代替ASCII。小心伙计们…;)
正如其他人提到的那样.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);
byte[]oriBytes={0xB0,0x2D};
字符串oriInStr=“”;
for(int a=0;a
为什么要使用ASCII码进行解码?您的输入是否仅限于ASCII?使用编码。默认值为,这将实现OSI中使用的代码页,您刚刚解决了它。只需使用Encoding.Unicode而不是ASCII。我使用我的电子硬件ARM和PIC的每一个字节。只要确保你在解码时知道输入编码,否则你会出现类似的错误。如果你真的不想用ascii表示字符串,这是可行的。我用一个很长的字符串(文本)测试了它,事实上复制了半页。将其转换为字节数组,然后再转换回字符串。我可以得到原文。。。小心这个简单的错误。它会导致严重的头痛,至少对我来说…;)你测试过你的代码吗?它给出了非常相同的结果!0x3F,0x2Di是的你怎么打印出来的?
byte[] oriBytes = { 0xB0, 0x2D };
string oriInStr = "";
for (int a = 0; a < oriBytes.Length; a++)
oriInStr += (char)(oriBytes[a]);
oriBytes = Encoding.ASCII.GetBytes(oriInStr);