85.11 16진수를 10진수로 변환하기
strtol 함수를 사용하지 않고 16진수로 된 문자열을 10진수로 변환하는 방법입니다. 변환식은 2진수를 10진수로 변환하는 방법과 큰 틀이 같습니다. 16진수를 10진수로 변환하려면 각 자릿수에서 값을 가져온 뒤 16에 해당 자릿수를 거듭제곱한 값과 곱하면 됩니다.
hex_string_to_dec.c
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <math.h> int main() { char hexadecimal[20] = "12C"; // 16진수로 된 문자열 int decimal = 0; // 10진수를 저장할 변수 int position = 0; for (int i = strlen(hexadecimal) - 1; i >= 0; i--) // 문자열을 역순으로 반복 { char ch = hexadecimal[i]; // 각 자릿수에 해당하는 문자를 얻음 if (ch >= 48 && ch <= 57) // 문자가 0~9이면(ASCII 코드 48~57) { // 문자에서 0에 해당하는 ASCII 코드 값을 빼고 // 16에 자릿수를 거듭제곱한 값을 곱함 decimal += (ch - 48) * pow(16, position); } else if (ch >= 65 && ch <= 70) // 문자가 A~F이면(ASCII 코드 65~70) { // 대문자로 된 16진수의 처리 // 문자에서 (A에 해당하는 ASCII 코드 값 - 10)을 빼고 // 16에 자릿수를 거듭제곱한 값을 곱함 decimal += (ch - (65 - 10)) * pow(16, position); } else if (ch >= 97 && ch <= 102) // 문자가 a~f이면(ASCII 코드 97~102) { // 소문자로 된 16진수의 처리 // 문자에서 (a에 해당하는 ASCII 코드 값 - 10)을 빼고 // 16에 자릿수를 거듭제곱한 값을 곱함 decimal += (ch - (97 - 10)) * pow(16, position); } position++; } printf("%d\n", decimal); // 300 return 0; }
실행 결과
300
문자열 hexadecimal의 문자가 0~9에 해당한다면 문자에서 0에 해당하는 ASCII 코드 값을 빼고 16에 자릿수를 거듭제곱한 값 pow(16, position)을 곱합니다. A~F에 해당한다면 문자에서 (A에 해당하는 ASCII 코드 값 65 - 10)을 빼고 pow(16, position)를 곱합니다(65에서 10을 빼는 이유는 A, B, C, D, E, F를 0, 1, 2, 3, 4, 5에 일치시키기 위해서 입니다). 만약 소문자 a~f에 해당한다면 (97 - 10)을 빼고 pow(16, position)를 곱하면 됩니다.