我們經常碰到16進制數轉10進制的情況,使用下面的C程序即可完成上述工作。
那麼他是怎樣的工作原理呢?
6.2.5 十六進制數轉換成十進制數 16進制就是逢16進1,但我們只有0~9這十個數字,所以我們用A,B,C,D,E,F這五個字母來分別表示 10,11,12,13,14,15。字母不區分大小寫。 十六進制數的第0位的權值為16的0次方,第1位的權值為16的1次方,第2位的權值為16的2次方…… 所以,在第N(N從0開始)位上,如果是是數 X (X 大於等於0,並且X小於等於 15,即:F)表示的大小為 X * 16的N次方。 假設有一個十六進數 2AF5, 那麼如何換算成10進制呢? 用豎式計算: 2AF5換算成10進制: 第0位: 5 * 160 = 5 第1位: F * 161 = 240 第2位: A * 162 = 2560 第3位: 2 * 163 = 8192 + ------------------------------------- 10997 直接計算就是: (5 * 160 ) + (F * 161 ) + (A * 162 ) + (2 * 163)= 10997 (別忘了,在上面的計算中,A表示10,而F表示15)注*
以此,程序的需要兩部分組成:
1. 權值計算
16的幾次方,power(16, x)
unsigned long power(int a, int b) { int i; unsigned long result = 1; for(i = 0; i < b; i++) { result *= a; } return result; };
2. 單16進制值轉10進制值
例如:如果是F,則表示15
switch (ch) { case '0': iCh = 0; break; case '1': iCh = 1; break; case '2': iCh = 2; break; case '3': iCh = 3; break; case '4': iCh = 4; break; case '5': iCh = 5; break; case '6': iCh = 6; break; case '7': iCh = 7; break; case '8': iCh = 8; break; case '9': iCh = 9; break; case 'a': iCh = 10; break; case 'b': iCh = 11; break; case 'c': iCh = 12; break; case 'd': iCh = 13; break; case 'e': iCh = 14; break; case 'f': iCh = 15; break; default: iCh = -1; break; }
int toLower(int c) { if(c >= 'A' && c <= 'Z') { return c + 'a' - 'A'; } else { return c; } };
/* * hex2int.c * * Created on: 2010-07-20 * Author: xiaobin * */ #include/* #include */ #include //#include /* int max is 32767 */ /* "%d" only print int */ /* long max is 2147483647 */ /* "%ld" can print long type */ /* unsigned long max is 4294967295 */ /* "%lu" can print unsigned long type */ #define MB 0x0100000UL unsigned long power(int a, int b); int toLower(int c); unsigned long htoi(char s[]); int main(int argc, char* argv[]) { if(argc > 1) printf("long integer: %lu\n", htoi(argv[1])); printf("M/Byte: %ld\n", MB); return 0; } unsigned long htoi(char *s) { int i, len; unsigned long value, result; int iCh; unsigned long iPow; int pos; char ch; result = 0; len = 0; value = 0; iCh = -1; len = strlen(s); pos = 0; len -= 1; for(i = len; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'f') || (s[i] >= 'A' && s[i] <= 'F'); i--) { ch = toLower(s[i]); /* tolower() defined in ctype.h */ switch (ch) { case '0': iCh = 0; break; case '1': iCh = 1; break; case '2': iCh = 2; break; case '3': iCh = 3; break; case '4': iCh = 4; break; case '5': iCh = 5; break; case '6': iCh = 6; break; case '7': iCh = 7; break; case '8': iCh = 8; break; case '9': iCh = 9; break; case 'a': iCh = 10; break; case 'b': iCh = 11; break; case 'c': iCh = 12; break; case 'd': iCh = 13; break; case 'e': iCh = 14; break; case 'f': iCh = 15; break; default: iCh = -1; break; } iPow = power(16, pos); pos++; value = iPow * iCh; result += value; } return result; }; unsigned long power(int a, int b) { int i; unsigned long result = 1; for(i = 0; i < b; i++) result *= a; return result; }; int toLower(int c) { if(c >= 'A' && c <= 'Z') return c + 'a' - 'A'; else return c; };
如有疑問請參考:《使用CDT+cygwin編寫C/C++》
注*: 參考文章《第六章 二進制、八進制、十六進制》 - 第2學堂南郁