将以 ASCII 字符表示的十六进制数转换为 C/C++ 中的十进制整数

Converting a hexadecimal number represented in ASCII characters to a decimal integer in C/C++

我的问题如下

我正在从传感器读取一段 ascii 数据,假设它是“400”。它存储在一个字符数组中。在十六进制 (ascii) 中是 { 0x34, 0x30, 0x30 }.

我想从这组字符中得到的是一个代表十六进制 0x400 的十进制整数,即 1024。这个 ascii 字符数组中的所有其他数值都以十进制表示,所以我一直在使用这个:

int num_from_ascii(char reading[], int start, int length){
    printf("++++++++num_from_ascii+++++++++\n");
    char radar_block[length];
    for(int i = 0; i < length; i++){
        radar_block[i] = reading[start + i];
        printf("%02x ", reading[start + i]);
    }
  printf("\n");
  return atoi(radar_block);
}

这显然只返回 400,但我需要一个十六进制值的十进制整数。有什么建议吗?

正如 Eugene 所建议的,您只需将 atoi(radar_block) 替换为 strtol(radar_block, NULL, 16)。这需要一个“基本”参数,可以是 10 代表十进制,16 代表十六进制(这是你想要的)等,或者 0 使用 C++ 规则自动检测(十六进制前导“0x”,八进制前导“0”。

无论如何你都不应该使用 atoi,因为它不能安全地处理无效输入。 strtol 完成了 atoi 所做的所有事情,为所有边缘情况定义了明确的 errno,并且还允许您将 "0" 与非数字输入区分开来。

正如 user3121023 提到的,不要忘记以 NUL 终止传递给 strtol 的字符串(这也是调用 atoi 的代码中的一个严重错误)。