代码之家  ›  专栏  ›  技术社区  ›  philcolbourn

如何将ascii十六进制字符转换为其值(0-15)?

  •  1
  • philcolbourn  · 技术社区  · 16 年前

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

    转换的最快、最短、最优雅或最晦涩的方法是什么 [0-9a-FA-F] 它的价值介于 0 和 15 ?

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

    我没有机会,所以我要去最无聊的地方。

    ( c <= '9' ) ? ( c - '0' ) : ( (c | '\x60') - 'a' + 10 )
    
    6 回复  |  直到 15 年前
        1
  •  2
  •   Marcelo Cantos    15 年前

    (c&15)+(c>>6)*9

    为了回答“它是如何工作的”,它丢弃了足够的位,以便数字映射到[0:9],字母映射到[1:6],然后为字母添加9。这个 c>>6 代表 if (c >= 64) ... .

        2
  •  1
  •   Guffa    16 年前

    一个简单的方法是用字符串查找它:

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

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

    int n = Char.ToUpper(c) - '0';
    if (n > 9) n -= 7;
    
        3
  •  1
  •   Meat Popsicle    16 年前
    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
  •  0
  •   codaddict    16 年前

    在 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
  •  0
  •   scunliffe    16 年前

    在javascript中:

    num = parseInt(hex, 16);
    
        6
  •  0
  •   Joachim Sauer    16 年前

    这是无聊的C版本(而且我的C已经生锈了,所以可能也错了)。

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