将以 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
的代码中的一个严重错误)。
我的问题如下
我正在从传感器读取一段 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
的代码中的一个严重错误)。