【问题标题】:Converting a hexadecimal number represented in ASCII characters to a decimal integer in C/C++将 ASCII 字符表示的十六进制数转换为 C/C++ 中的十进制整数
【发布时间】:2021-03-04 02:14:24
【问题描述】:

我的问题如下。

我正在从传感器读取一段 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,但我需要一个十六进制值的十进制整数。有什么建议吗?

【问题讨论】:

  • 我的问题是您是否应该从字面上阅读单个值。
  • 我从中提取的样本肯定应该是 1024,所以我对所提供的值以及如果有帮助的话如何读取它们很有信心。
  • strtoul 将为您处理大部分工作
  • 如果不先转换为数字,您将无法真正做到这一点。将400 读取为字符串,将其转换为int 并将int 打印为十进制。
  • 该部分已经通过帖子中的该功能完成。那将返回一个代表 400 的整数,但整数不是 400,它应该是 0x400 或 1024(我想要的整数)

标签: c++ c serial-port hex ascii


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的帮助
猜你喜欢
  • 2017-08-12
  • 2013-12-22
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2018-01-03
  • 2015-11-29
  • 2011-08-11
相关资源
最近更新 更多