如何将ASCII HEX字符转换为它的值(0-15)?

时间:2010-03-23 10:18:38

标签: ascii hex

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

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

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

我没有机会,所以我会最无聊的。

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

6 个答案:

答案 0 :(得分:2)

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

为了回应“它是如何工作的”,它抛出足够的位以使数字映射到[0:9]并且字母映射到[1:6],然后为字母添加9。 c>>6if (c >= 64) ...的替身。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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';

答案 4 :(得分:0)

在JavaScript中:

num = parseInt(hex, 16);

答案 5 :(得分:0)

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

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