【问题标题】:C# hex to asciiC# 十六进制转ASCII
【发布时间】:2011-08-02 13:35:31
【问题描述】:

我正在尝试使用以下方法将十六进制字符串转换为 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);
}

但我得到一个超出或边界异常,我确定这是一个明显的错误,但我尝试过的其他代码也不起作用。我做错了什么?

【问题讨论】:

  • ASCII?就像在 Java 中一样,.NET 字符串也是 Unicode。

标签: c# string ascii hex


【解决方案1】:

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

for (int i = 0; i < hexString.Length - 1, i += 2)

【讨论】:

    【解决方案2】:

    这里有四个三个问题:

    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)));
    }
    

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

    【讨论】:

    • 谢谢,差不多了,我得到一个溢出异常“太大或太小”,当我有一个时会发布修复
    • 异常发生在哪里?
    • 在“sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));”中对于字符而言,值太小或太大:/
    • @Pete:您使用的是string hs = hexString.Substring(i, 2); 还是您原来的Substring(i, i + 2),它占用了太多字符?
    • @Pete:该代码适用于我(即格式良好的十六进制输入)。您可以发布您现在使用的完整代码吗?
    【解决方案3】:
    String hs = hexString.Substring(i, i + 2);
    System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();
    

    您是否注意到您从未使用过hs??

    您是否一遍又一遍地转换前 2 个字符?

    【讨论】:

    • "你注意到你从不使用 hs 吗??"是的,这是一个愚蠢的错误“而且你一遍又一遍地转换前 2 个字符?”不,我没有大声笑
    【解决方案4】:

    此代码会将十六进制字符串转换为 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;
    }
    

    备注

    2 = 没有。用于表示 ASCII 字符的 hexString 字符。

    System.Convert.ToUInt32(hs, 16) = "将基数为 16 的十六进制子字符串转换为无符号的 32 位整数"

    【讨论】:

    • 备注 2 = 没有。用于表示 ASCII 字符的 hexString 字符。 System.Convert.ToUInt32(hs, 16) 表示“将基数 16 十六进制子字符串转换为无符号 32 位 int”
    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2014-06-22
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2011-12-09
    • 2015-05-22
    相关资源
    最近更新 更多