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

问题描述:

任何人都可以请帮助发现错误?下面的代码:字节为String到字节转换令人费解的错误

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

我不能回来的0xB00x2D原始字节值。

+1

为什么要使用解码ASCII?您的输入是否限制为ASCII? – 2014-11-24 07:55:03

+0

使用'Encoding.Default',这实现了您的操作系统中使用的代码页 – leppie 2014-11-24 07:57:09

+0

我刚刚解决了这个问题。只需使用Encoding.Unicode而不是ASCII。我为我的电子硬件,ARM和PIC处理每一个字节的位。 – 2014-11-24 08:08:50

0XB0不是一个有效的ASCII码。你可以阅读here

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

在你的byte [] 0xB0变为176 0x2D更改为45。当从只有128个字符的ASCII转换176会给你? (未定义)和45给你 - 。

尝试调试代码,看看发生了什么。

这是因为appearantly .NET doesn't supportExtended 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 
+0

这是行之有效的,如果你不真实希望字符串以ascii表示。 – Vajura 2014-11-24 07:56:58

+0

我测试了一个非常长的字符串(文本),实际上复制了半页。将其转换为字节数组,然后回到字符串。我可以得到原始文本...只要注意这个简单的错误。它可以导致严重的头痛,至少对我来说...;) – 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); 
+0

你测试了你的代码?它给出了非常相同的结果! 0x3F,0x2D – 2014-11-25 00:31:21

+0

我确实是如何打印出来的? – Vajura 2014-11-25 06:08:04