【问题标题】:How to convert an ASCII HEX character to it's value (0-15)?如何将 ASCII HEX 字符转换为它的值(0-15)?
【发布时间】:2010-03-23 10:18:37
【问题描述】:

我正在编写一个字符串解析器,我想到可能有一些非常有趣的方法可以将 ASCII 十六进制字符 [0-9A-Fa-f] 转换为它的数值。

[0-9A-Fa-f] 转换为015 之间的值的最快、最短、最优雅或最晦涩的方法是什么?

如果您愿意,假设该字符是有效的十六进制字符。

我没有机会,所以我会在最无聊的时候尝试一下。

( c <= '9' ) ? ( c - '0' ) : ( (c | '\x60') - 'a' + 10 )

【问题讨论】:

  • 任何特定的语言?
  • 我在玩 C,但请随意。

标签: ascii hex


【解决方案1】:

(c&amp;15)+(c&gt;&gt;6)*9

为了响应“它是如何工作的”,它丢弃了足够多的位,以便数字映射到 [0:9] 并且字母映射到 [1:6],然后为字母添加 9。 c&gt;&gt;6if (c &gt;= 64) ... 的替代品。

【讨论】:

  • 第一部分 c&15 将为您提供 0-9 的数字(它们是 0x30 到 0x39,& 0x0F 清除前 4 位数字 => 0x00-0x09)。对于字母 A-F,你会得到 1-6(A 是 0x41,F 是 0x46,& 0x0F 等)现在对于你想要的字母 10-15,而不是 1-6,所以你需要加 9,但只有为信件。好吧,数字是 0011xxxx,字母(A-F)是 0100xxxx,向右移动 6 次,数字为 00,字母为 01。将其乘以 9,数字的结果为 0,字母的结果为 9。现在将它添加到第一部分,你就设置好了。
  • +1 ,很好。虽然不适用于小写字母,但可以修改为。
  • @David V:我认为它适用于大小写。我测试了它,它确实有效。
  • 没有比较或跳跃,这可能是最快和最小的。 gcc -O3 14 字节。
  • gcc 乘以 9 乘以 (c&gt;&gt;6&lt;&lt;3)+(c&gt;&gt;6)c/64*8 + c/64
【解决方案2】:

一种简单的方法是在字符串中查找:

int n = "0123456789ABCDEF".IndexOf(Char.ToUpper(c));

另一种方法是将其转换为数字,然后检查是否为字符:

int n = Char.ToUpper(c) - '0';
if (n > 9) n -= 7;

【讨论】:

    【解决方案3】:
    private byte[] HexStringToBytes( string hexString )
    {
        byte[] bytes = ASCIIEncoding.ASCII.GetBytes(hexString);
        byte[] ret = new byte[bytes.Length / 2];
        for (int i = 0; i < bytes.Length; i += 2)
        {
           byte hi = (byte)(((bytes[i] & 0x40) == 0) ? bytes[i] & 0x0F : bytes[i] & 0x0F + 9);
           byte lo = (byte)(((bytes[i+1] & 0x40) == 0) ? bytes[i+1] & 0x0F : bytes[i+1] & 0x0F + 9);
           ret[i / 2] = (byte)((hi << 4) | lo);
        }
        return ret;
    }
    

    【讨论】:

    • 稍微解释一下代码的工作原理,可以改进这个答案。
    【解决方案4】:

    C 你可以这样:

    if(isdigit(c)) 
      num = c -'0';
    else if(c>='a' && c<='f')
      num = 10 + c - 'a';
    else if(c>='A' && c<='F')
      num = 10 + c - 'A';
    

    【讨论】:

      【解决方案5】:

      在 JavaScript 中:

      num = parseInt(hex, 16);
      

      【讨论】:

        【解决方案6】:

        这是无聊的 C 版本(我的 C 很生锈,所以它也可能是错误的)。

        char parseIntChar(const char p) {
          char c[2];
          c[0]=p;
          c[1]=0;
          return strtol(c,0,16);
        }
        

        【讨论】:

          猜你喜欢
          • 2011-02-12
          • 1970-01-01
          • 2013-04-01
          • 2013-02-28
          • 2019-09-13
          • 2023-04-07
          • 1970-01-01
          • 2021-12-26
          • 1970-01-01
          相关资源
          最近更新 更多