c#编码中的一个奇怪的事情

时间:2012-11-06 08:54:10

标签: c# encoding

我将byte array转换为string,然后将此string转换为byte array。 这两个字节数组是不同的。

如下:

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

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

6 个答案:

答案 0 :(得分:5)

188超出ASCII范围。不在相应字符集中的字符转换为“?”按设计(你更喜欢转置为“1/4”吗?)

答案 1 :(得分: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”)或 {{3} (通常混淆使用扩展ASCII,但实际上并非如此)。

您可以使用以下代码:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

如果您需要使用任意字节数组并获取一系列字符,您可能需要查看ConvertToBase64StringFromBase64String 。如果那不是你想要做的,也许可以向我们解释原来的问题

答案 5 :(得分:1)

188不在ASCII(7位)范围内,您应该使用Encoding.Default来获取ANSI编码:

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