我将 a 转换byte array为 a 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
所以这是我的问题,有什么问题吗?
188 超出了 ASCII 的范围。不在对应字符集中的字符被转置为'?' 设计使然(您更喜欢转换为“1/4”吗?)
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 定义。相反,你得到63的是一个问号。
ASCII字符集的范围是 1 到 127。可以看到 188 不在此范围内,而是转换为 ? (= ASC 63)。
并非每个字节序列都必须是特定编码的有效编码值序列。
因此,任意字节数组 的结果Encoding.ASCII.GetString(b)定义不明确b。(并且对于任何其他编码也可能是)。
如果您需要获取任意字节数组并获取字符序列,您可能需要查看Convert类ToBase64String和FromBase64String. 如果这不是您想要做的,也许可以向我们解释最初的问题。
188不在 ASCII(7 位)范围内,您应该使用Encoding.Default来获取 ANSI 编码:
byte[] b = new byte[3]{ 3, 188, 2 };
byte[] tmp = Encoding.Default.GetBytes(Encoding.Default.GetString(b));