我正在尝试将十六进制字符串转换为ASCII,使用:
public void ConvertHex(String hexString)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hexString.Length; i += 2)
{
String hs = hexString.Substring(i, i + 2);
System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();
}
String ascii = sb.ToString();
MessageBox.Show(ascii);
}
但是我得到一个out或bounds异常,我确定它是一个明显的错误,但我尝试过的其他代码也不起作用。我做错了什么?
答案 0 :(得分:24)
此代码将十六进制字符串转换为ASCII,您可以将其复制粘贴到一个类中并使用它而不进行实例化
public static string ConvertHex(String hexString)
{
try
{
string ascii = string.Empty;
for (int i = 0; i < hexString.Length; i += 2)
{
String hs = string.Empty;
hs = hexString.Substring(i,2);
uint decval = System.Convert.ToUInt32(hs, 16);
char character = System.Convert.ToChar(decval);
ascii += character;
}
return ascii;
}
catch (Exception ex) { Console.WriteLine(ex.Message); }
return string.Empty;
}
答案 1 :(得分:19)
这里有四个三个问题:
i
递增2,因此需要在hexString.Length - 1
处终止。hexString
获取了错误的字符数。hs
从未使用过。sb
附加任何内容。试试这个:
for (int i = 0; i < hexString.Length; i += 2)
{
string hs = hexString.Substring(i, 2);
sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));
}
请注意,不需要使用其命名空间System
来限定类型(假设您已使用using
语句在文件顶部引用它。)
答案 2 :(得分:2)
String hs = hexString.Substring(i, i + 2);
System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();
您是否注意到您从未使用hs
??
你是不是一遍又一遍地转换前2个字符?
答案 3 :(得分:1)
由于您将索引递增2,因此需要在字符串长度的前端停止循环。否则,循环的最后一次迭代将尝试读取超过字符串结尾的字符。
for (int i = 0; i < hexString.Length - 1, i += 2)