Как преобразовать ASCII HEX символ в его значение (0-15)? - PullRequest
1 голос
/ 23 марта 2010

Я пишу синтаксический анализатор строк, и мне пришла в голову мысль, что могут быть некоторые действительно интересные способы преобразования шестнадцатеричного символа ASCII [0-9A-Fa-f] в его числовое значение.

Какие самые быстрые, самые короткие,самые элегантные или самые неясные способы преобразования [0-9A-Fa-f] в его значение между 0 и 15?

Предположим, что символ является действительным шестнадцатеричным символом.

У меня нет шансов, поэтому я попробую самое скучное.

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

Ответы [ 6 ]

2 голосов
/ 23 марта 2010

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

В ответ на «Как это работает» он выбрасывает достаточно битов, чтобы числа соответствовали [0: 9], а буквы - [1: 6], а затемдобавляет 9 для писем.c>>6 является заменой для if (c >= 64) ....

1 голос
/ 23 сентября 2010
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;
}
1 голос
/ 23 марта 2010

Один простой способ - найти его в строке:

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

Другой способ - преобразовать его в цифру и проверить, является ли он символом:

int n = Char.ToUpper(c) - '0';
if (n > 9) n -= 7;
0 голосов
/ 23 марта 2010

Вот скучная версия C (а мой C очень ржавый, так что, вероятно, тоже не так)

char parseIntChar(const char p) {
  char c[2];
  c[0]=p;
  c[1]=0;
  return strtol(c,0,16);
}
0 голосов
/ 23 марта 2010

В JavaScript:

num = parseInt(hex, 16);
0 голосов
/ 23 марта 2010

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