c#编码中的一个奇怪的事情
我将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
这就是我的问题,它有什么问题?
ASCII仅为7位,因此其他无效。 默认情况下它使用?
替换任何无效的字节,这就是为什么你得到一个?
。
对于8位字符集,您应该寻找扩展ASCII (后来定义为“ISO 8859-1”)或代码页437 (通常与扩展ASCII 混淆 ,但实际上并非如此)。
您可以使用以下代码:
Encoding enc = Encoding.GetEncoding("iso-8859-1"); // For CP437, use Encoding.GetEncoding(437) byte[] tmp = enc.GetBytes(enc.GetString(b));
188超出ASCII范围。 不在相应字符集中的字符转换为“?” 按设计(你更喜欢转置为“1/4”吗?)
字符188
未定义为ASCII。 相反,你得到63
,这是一个问号。
ASCII字符集的范围是1到127.您可以看到188不在此范围内并转换为? (= ASC 63)。
188
不在ASCII(7位)范围内,您应该使用Encoding.Default
来获取ANSI编码:
byte[] b = new byte[3]{ 3, 188, 2 }; byte[] tmp = Encoding.Default.GetBytes(Encoding.Default.GetString(b));
并非每个字节序列都必须是特定编码的有效编码值序列。
因此,在任意字节数组Encoding.ASCII.GetString(b)
上的Encoding.ASCII.GetString(b)
的结果定义很差。 (也可以,对于任何其他编码也)。
如果需要获取任意字节数组并获取字符序列,则可能需要查看Convert
类ToBase64String
和FromBase64String
。 如果那不是你想要做的,也许可以向我们解释原始问题 。