在c#中将十六进制转换为ascii时遇到麻烦

本文关键字:ascii 遇到 麻烦 转换 十六进制 | 更新日期: 2023-09-27 17:49:42

下面的代码有问题,我得到这个错误…

value对于字符来说太大或太小…行

sb.Append (Convert.ToChar(转换。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#有什么新建议吗?

谢谢:)

在c#中将十六进制转换为ascii时遇到麻烦

似乎你的十六进制子字符串转换成一个UInt32位基数16(十六进制),是太大(越界)的字符集,你正在使用。

检查对Uint32和的转换,确保确实可以转换为char,这意味着它是有效的。

EDIT

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

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

这应该能解决实际问题。

虽然这并没有破坏任何东西,但您应该意识到您正在做的是而不是转换为ASCII。ASCII是一种特殊的字符编码,Convert.ToChar将数字转换为相应的Unicode(特别是UTF-16)字符。只要您的值范围仅从0127(十六进制的007F),那么您就可以在所有实际用途中使用,因为Unicode格式与标准ASCII字符集共享字符。但是,如果您的字符使用ASCII扩展之一(例如,Windows上常见的Latin-1),则这些字符将不匹配。

如果你的数据是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);
string assumedASCII = string.Format(@"'x{0:x4}", (int)hexString);