Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将ASCII字符表示的十六进制数转换为C/C中的十进制整数++_C++_C_Serial Port_Hex_Ascii - Fatal编程技术网

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

C++ 将ASCII字符表示的十六进制数转换为C/C中的十进制整数++,c++,c,serial-port,hex,ascii,C++,C,Serial Port,Hex,Ascii,我的问题如下 我正在从传感器读取一段ascii数据,假设是400。它存储在一个字符数组中。在十六进制ascii中,这将是{0x34,0x30,0x30} 我试图从这组字符中得到一个十进制整数,代表十六进制0x400,即1024。此ascii字符数组中的所有其他数值均以十进制表示,因此我一直在使用: int num_from_ascii(char reading[], int start, int length){ printf("++++++++num_from_ascii++

我的问题如下

我正在从传感器读取一段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所建议的,您需要做的就是将atoiradar_块替换为strtolradar_块,NULL,16。这需要一个基本的参数,它可以是十进制的10,16是十六进制,这是你想要的,等等,或者0使用C++规则自动检测,用十六进制来引导十六进制,导致0为八进制。 无论如何都不应该使用atoi,因为它不能安全地处理无效输入。strtol完成了atoi所做的一切,为所有边缘情况定义了良好的errno,还允许您区分0和非数字输入


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

我的问题是您是否应该逐字读取单个值。我从中提取的示例当然应该是1024,因此,我对提供的值以及如何读取这些值很有信心,如果这有帮助的话。strtoul将为您处理大部分工作。如果不先转换为数字,您就无法真正做到这一点。把400读成字符串,把它转换成整数,然后把整数打印成十进制。这部分已经通过post中的函数完成了。这将返回一个表示400的整数,但这个整数不是400,应该是0x400或1024,我想要的整数谢谢你的帮助