4

我将 a 转换byte array为 a string,然后将其转换stringbyte 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

所以这是我的问题,有什么问题吗?

4

6 回答 6

5

188 超出了 ASCII 的范围。不在对应字符集中的字符被转置为'?' 设计使然(您更喜欢转换为“1/4”吗?)

于 2012-11-06T08:59:29.040 回答
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));
于 2012-11-06T09:08:48.317 回答
1

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

于 2012-11-06T08:59:34.350 回答
1

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

于 2012-11-06T09:00:35.817 回答
1

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

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

如果您需要获取任意字节数组并获取字符序列,您可能需要查看ConvertToBase64StringFromBase64String. 如果这不是您想要做的,也许可以向我们解释最初的问题

于 2012-11-06T09:01:17.703 回答
0

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

byte[] b = new byte[3]{ 3, 188, 2 };
byte[] tmp = Encoding.Default.GetBytes(Encoding.Default.GetString(b));
于 2012-11-06T09:10:13.107 回答