字节为String到字节转换令人费解的错误
任何人都可以请帮助发现错误?下面的代码:字节为String到字节转换令人费解的错误
byte[] oriBytes = { 0xB0, 0x2D }; // oriBytes -> 0xB0, 0x2D
string oriInStr = Encoding.ASCII.GetString(oriBytes); // oriInStr -> "?-"
oriBytes = Encoding.ASCII.GetBytes(oriInStr); // oriBytes -> 0x3F, 0x2D
我不能回来的0xB0
,0x2D
原始字节值。
在你的byte [] 0xB0
变为176 0x2D
更改为45。当从只有128个字符的ASCII转换176会给你? (未定义)和45给你 - 。
尝试调试代码,看看发生了什么。
这是因为appearantly .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);
ahaah ..我知道了!使用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
这是行之有效的,如果你不真实希望字符串以ascii表示。 – Vajura 2014-11-24 07:56:58
我测试了一个非常长的字符串(文本),实际上复制了半页。将其转换为字节数组,然后回到字符串。我可以得到原始文本...只要注意这个简单的错误。它可以导致严重的头痛,至少对我来说...;) – 2014-11-24 08:03:07
正如其他人所说的.Net不支持扩展ascii。为了解决这个问题,你应该将字节值转换为char,它是essentialy int,它会正确映射它们。
byte[] oriBytes = { 0xB0, 0x2D };
string oriInStr = "";
for (int a = 0; a < oriBytes.Length; a++)
oriInStr += (char)(oriBytes[a]);
oriBytes = Encoding.ASCII.GetBytes(oriInStr);
你测试了你的代码?它给出了非常相同的结果! 0x3F,0x2D – 2014-11-25 00:31:21
我确实是如何打印出来的? – Vajura 2014-11-25 06:08:04
为什么要使用解码ASCII?您的输入是否限制为ASCII? – 2014-11-24 07:55:03
使用'Encoding.Default',这实现了您的操作系统中使用的代码页 – leppie 2014-11-24 07:57:09
我刚刚解决了这个问题。只需使用Encoding.Unicode而不是ASCII。我为我的电子硬件,ARM和PIC处理每一个字节的位。 – 2014-11-24 08:08:50