十六進制為基數 16,數字 0-9 表 0-9,A-F(或 a-f)表 10-15。第 N 位(從 0 起)權值為 16^N。
例:2AF5 = 2×16³ + 10×16² + 15×16¹ + 5×16⁰ = 8192+2560+240+5 = 10997。
power(16, exp) 回傳 16^exp。'0'-'9' → 0-9,'a'-'f'/'A'-'F' → 10-15,其餘回傳 -1。值 × 權值。/* hex2int.c - 十六進制轉十進制 */
#include <stdio.h>
#include <string.h>
#define MB 0x0100000UL // 1 MB 常數示範
unsigned long power(int base, int exp);
int to_lower(int c);
unsigned long htoi(const char *s);
int main(int argc, char *argv[]) {
if (argc > 1) {
printf("long integer: %lu\n", htoi(argv[1]));
}
printf("M/Byte: %lu\n", MB);
return 0;
}
unsigned long htoi(const char *s) {
int len = strlen(s);
unsigned long result = 0;
int pos = 0; // 16^pos
for (int i = len - 1; i >= 0; --i) {
char ch = to_lower(s[i]);
int val;
if (ch >= '0' && ch <= '9') val = ch - '0';
else if (ch >= 'a' && ch <= 'f') val = ch - 'a' + 10;
else continue; // 忽略非法字元(如 "0x" 前綴)
unsigned long p = power(16, pos++);
result += p * val;
}
return result;
}
unsigned long power(int base, int exp) {
unsigned long res = 1;
while (exp--) res *= base;
return res;
}
int to_lower(int c) {
return (c >= 'A' && c <= 'Z') ? c + 'a' - 'A' : c;
}
to_lower 統一轉小寫再判斷。"0x2AF5" 等帶前綴字串。unsigned long 可表示至 4,294,967,295(32 位),足夠 8 位十六進制(FFFFFFFF)。實際專案建議直接用 strtoul(s, NULL, 16)(<stdlib.h>),自動處理前綴、溢位、錯誤碼,且經過高度優化。
#include <stdlib.h>
unsigned long val = strtoul("2AF5", NULL, 16); // 10997
void itoh(unsigned long val, char *buf) {
const char *hex = "0123456789ABCDEF";
char tmp[16]; int i = 0;
if (val == 0) { buf[0]='0'; buf[1]='\0'; return; }
while (val) { tmp[i++] = hex[val & 0xF]; val >>= 4; }
for (int j=0; j