2012-11-06 87 views
3

我将byte array转换为string,并且我将此string转换为byte array。 这两个字节数组是不同的。c#编码中奇怪的东西

如以下:

byte[] tmp = Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(b)); 

假设b是一个字节数组。

B [0] = 3,B [1] = 188,B [2] = 2 //十进制

结果:

TMP [0] = 3 ,tmp [1] = 63,tmp [2] = 2

这就是我的问题,它有什么问题?

+4

ASCII有7位数据。您正在寻找ANSI或其他编码。 – leppie

回答

4

ASCII仅为7位,所以其他人无效。 By default it uses ? to replace any invalid bytes and that's why you get a ?.

对于8位字符集,你应该寻找要么Extended ASCII(稍后定义的“ISO 8859-1”)或code page 437(这往往是混淆与扩展ASCII,但事实上并非如此)。

您可以使用下面的代码:

Encoding enc = Encoding.GetEncoding("iso-8859-1"); 
// For CP437, use Encoding.GetEncoding(437) 
byte[] tmp = enc.GetBytes(enc.GetString(b)); 
5

188超出了ASCII的范围。不在相应字符集中的字符转置为'?'通过设计(你愿意转换为“1/4”吗?)

1

字符188没有为ASCII定义。相反,你得到63,这是一个问号。

1

ASCII字符集的范围是从1到127.您可以看到188不在此范围内,并且转换为? (= ASC 63)。

1

并非每个字节序列都必然是特定编码的有效编码值序列。

因此对任意字节数组b的定义不明确。 (也可以,对于任何其他编码)。

如果需要采取任意字节数组,并获得字符序列,你可能想看看进入ConvertToBase64StringFromBase64String。如果这不是你想要做的,也许可以向我们解释原始的问题

1

188是不是在ASCII(7位)的范围内,你应该使用Encoding.Default得到ANSI编码:只有

byte[] b = new byte[3]{ 3, 188, 2 }; 
byte[] tmp = Encoding.Default.GetBytes(Encoding.Default.GetString(b));