我正在编写一个字符串解析器,我想到可能有一些非常有趣的方法可以将ASCII十六进制字符[0-9A-Fa-f]
转换为它的数值。
将[0-9A-Fa-f]
转换为0
和15
之间的价值的最快,最短,最优雅或最晦涩的方式是什么?
如果您愿意,假设该字符是有效的十六进制字符。
我没有机会,所以我会最无聊的。
( c <= '9' ) ? ( c - '0' ) : ( (c | '\x60') - 'a' + 10 )
答案 0 :(得分:2)
(c&15)+(c>>6)*9
为了回应“它是如何工作的”,它抛出足够的位以使数字映射到[0:9]并且字母映射到[1:6],然后为字母添加9。 c>>6
是if (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);
}