實務上常需將十六進制字串(如 "1A4E")解析為整數。雖有 strtol、sscanf 等庫函數,手寫解析器有助於理解細節與處理特殊格式。
short int xstrtoshortint(char *str) {
short int ivalue = 0;
int ioffset = 0;
char *ptr = str;
while (*ptr != '\0') {
ivalue = ivalue << ioffset; // 首次不位移,之後每次左移 4 bits
if (*ptr >= '0' && *ptr <= '9')
ivalue += *ptr - '0';
else if (*ptr >= 'a' && *ptr <= 'f')
ivalue += *ptr - 'a' + 10;
else if (*ptr >= 'A' && *ptr <= 'F')
ivalue += *ptr - 'A' + 10;
ptr++;
ioffset = 4;
}
return ivalue;
}
short int xstrtoshortint(char *str) {
int len = strlen(str);
short int ivalue = 0;
for (int i = 0; i < len; i++) {
if (str[i] >= '0' && str[i] <= '9')
ivalue = ivalue * 16 + (str[i] - '0');
else if (str[i] >= 'a' && str[i] <= 'f')
ivalue = ivalue * 16 + (str[i] - 'a') + 10;
else if (str[i] >= 'A' && str[i] <= 'F')
ivalue = ivalue * 16 + (str[i] - 'A') + 10;
}
return ivalue;
}
short val = xstrtoshortint("1A4E"); // 得到 0x1A4E (6734)
用 sprintf(buf, "%04X", val) 或 std::stringstream 配合 std::hex、std::uppercase、std::setw、std::setfill('0')。