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進数の表記にできる。