Shammer's Philosophy

My private adversaria

16進数を10進数に戻す関数

16進数を10進数に戻す関数-20130202 - Shammerismでも同じタイトルの記事を書いた。以前はLispで書いたが、今回はC言語文字列の反転 - Shammerismで作成したreverse_stringも使用する。

void hex_to_decimal(char *value){
  int i = 0;
  int n;
  int base = 1;
  long result = 0;
  char c;
  while( value[i] != '\0' ){
    if ( '0' <= value[i] && value[i] <= '9' ){
      n = value[i] - '0';
    }
    else if ( 'a' <= (c = tolower(value[i])) && c <= 'f') {
      n = c - 'a' + 10;
    }
    else {
      printf("Detected invalid character: %c\n", value[i]);
      exit(1);
    }
    i++;
    result = result + base * n;
    base = base * 16;
  }
  printf("%d\n", result);
}

int main(int argc, char *argv[]){
  if ( argc != 2 ){
    printf("Usage: %s value\n", argv[0]);
    return 1;
  }
  hex_to_decimal(reverse_string(argv[1]));
  return 0;
}

まず、引数の文字列を反転する。基数(base)が1からの方が桁が変わるごとに16倍していけばよいのでやりやすい。
n = value[i] - '0';は、c++ - How to convert a single char into an int - Stack Overflowで紹介されている。char型の数字を計算可能な数値型に変換する伝統的な方法らしい。
n = c - 'a' + 10;も、'a'との差分を10に加算することで10進数の表記にできる。