无法在C#中将hex转换为ascii

时间:2011-04-10 21:01:22

标签: c# ascii overflow hex

遇到以下代码问题,我收到此错误...

对于角色来说,

值太大或太小......在线

sb.Append(Convert.ToChar(Convert.ToUInt32(hs,16)));

        for (int i = 0; i < hexString.Length - 1; i += 2)
        {
            String hs = hexString.Substring(i, i + 2);

            sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));

        }

对C#有新的建议吗?

谢谢:)

3 个答案:

答案 0 :(得分:0)

当转换为UInt32位基16(十六进制)时,看起来像你的十六进制子串,你正在使用的字符集太大(越界)。

检查您转换为Uint32和确保确实可以将其转换为char,这意味着它有效。

答案 1 :(得分:0)

修改

正如@Lasse指出的那样,Substring采用了起始索引和长度,但看起来你正试图传递一个起始索引和一个停止索引,因为您将i + 2传递给每个电话。这意味着第一次迭代将创建一个双字符子串,第二次将是一个三字符子串,依此类推。只需将2传递给它:

String hs = hexString.Substring(i, 2);

那应该纠正实际问题。

虽然这没有破坏任何东西,但你应该知道你正在做的是而不是转换为ASCII。 ASCII是特定的字符编码,Convert.ToChar将数字转换为其对应的 Unicode (特别是UTF-16)字符。只要您的值的范围仅从0127007F十六进制),那么您可以将其用于所有实际目的,因为Unicode格式共享带有标准ASCII字符集的字符。但是,如果你的角色使用其中一个扩展名为ASCII(例如,拉丁语-1,这在Windows上很常见),那么这些字符将匹配。

如果您的数据是ASCII格式且需要支持大于127的值,则可以将十六进制字符串转换为byte[],然后将其传递给ASCIIEncoding类以使用ASCII格式:

byte[] data = new byte[hexString.Length / 2];

for(int i = 0; i < hexString.Length - 1; i += 2)
{
    data[i / 2] = byte.Parse(hexString.Substring(i, 2));
}

string output = System.Text.Encoding.ASCII.GetString(data);

答案 2 :(得分:0)

string assumedASCII = string.Format(@"\x{0:x4}", (int)hexString);