C#hex到ascii

Pet*_*ete 17 c# string hex ascii

我正在尝试将十六进制的字符串转换为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);
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个out或bounds异常,我确定它是一个明显的错误,但我尝试过的其他代码也不起作用.我究竟做错了什么?

小智 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;
}
Run Code Online (Sandbox Code Playgroud)


Wil*_*den 20

这里有三个问题:

  1. 由于您i在每次迭代时递增2,因此需要终止于hexString.Length - 1.这实际上并不重要; 在最后一次迭代之后递增2将使计数器高于检查长度而不管.
  2. 你从中获取了错误的字符数hexString.
  3. hs 从未使用过.
  4. 你没有附加任何东西sb.

试试这个:

for (int i = 0; i < hexString.Length; i += 2)
{
    string hs = hexString.Substring(i, 2);
    sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));
}
Run Code Online (Sandbox Code Playgroud)

请注意,不需要使用其命名空间限定类型System(假设您已使用using语句在文件顶部引用它).


And*_*ite 1

由于您要将索引增加 2,因此您需要在字符串长度末尾之前停止循环。否则,循环的最后一次迭代将尝试读取字符串末尾之后的字符。

for (int i = 0; i < hexString.Length - 1, i += 2)
Run Code Online (Sandbox Code Playgroud)