C#hex到ascii

时间:2011-04-10 16:57:08

标签: c# string ascii hex

我正在尝试将十六进制字符串转换为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异常,我确定它是一个明显的错误,但我尝试过的其他代码也不起作用。我做错了什么?

4 个答案:

答案 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)

这里有四个三个问题:

  1. 由于您在每次迭代时将i递增2,因此需要在hexString.Length - 1处终止。这实际上并不重要;在最后一次迭代后递增2将使计数器高于检查长度,无论如何。
  2. 您从hexString获取了错误的字符数。
  3. hs从未使用过。
  4. 您没有向sb附加任何内容。
  5. 试试这个:

    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)