在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#有什么新建议吗?谢谢:)
似乎你的十六进制子字符串转换成一个UInt32位基数16(十六进制),是太大(越界)的字符集,你正在使用。
检查对Uint32和的转换,确保确实可以转换为char,这意味着它是有效的。
EDIT
正如@Lasse指出的那样,Substring
需要一个开始索引和一个长度,但是看起来你试图传递一个开始索引和一个停止索引,因为你将i + 2
传递给每个调用。这意味着第一次迭代将创建一个两个字符的子字符串,第二次迭代将创建一个三个字符的子字符串,以此类推。只需将2
传递给它:
String hs = hexString.Substring(i, 2);
这应该能解决实际问题。
虽然这并没有破坏任何东西,但您应该意识到您正在做的是而不是转换为ASCII。ASCII是一种特殊的字符编码,Convert.ToChar
将数字转换为相应的Unicode(特别是UTF-16)字符。只要您的值范围仅从0
到127
(十六进制的00
到7F
),那么您就可以在所有实际用途中使用,因为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);