You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++字符串转十六进制值问题:字符串转int结果不符合预期

十六进制字符串转整数异常的解决方法

问题原因

Arduino中String.toInt()方法默认按十进制规则解析字符串,一旦遇到非0-9的字符(比如十六进制的B、F)就会停止解析。所以像"000B"这样的字符串,只会解析前面的连续0,最终结果为0,而非预期的11(十六进制0xB对应的十进制值)。

解决方案

推荐使用C标准库函数strtol(),它支持指定进制解析字符串,完美适配十六进制转换需求:

void setup() {
  Serial.begin(9600);
  // 十六进制格式字符串
  String string0 = "06";
  String string1 = "000B";
  String string2 = "00FE";
  
  // 调用strtol解析十六进制字符串:
  // c_str() 将Arduino String转为C风格字符数组
  // NULL 表示不需要记录停止解析的位置
  // 16 指定按十六进制解析
  int checkSum0 = strtol(string0.c_str(), NULL, 16);
  int checkSum1 = strtol(string1.c_str(), NULL, 16);
  int checkSum2 = strtol(string2.c_str(), NULL, 16);
  
  int checkSumTotal = checkSum0 + checkSum1 + checkSum2;
  
  Serial.println(checkSum1); // 现在会输出预期的11
  Serial.print("总校验和(十进制): ");
  Serial.println(checkSumTotal);
  Serial.print("总校验和(十六进制): ");
  Serial.println(checkSumTotal, HEX); // 十六进制输出总校验和
}

void loop() {}

注意事项

  • 若十六进制数值超出Arduino int类型范围(以Uno为例,16位int范围是-32768~32767),请改用long类型存储转换结果,避免溢出。
  • 确保输入的字符串是合法的十六进制格式(仅包含0-9、A-F/a-f),否则strtol()会解析到非法字符为止,返回前半段合法数值。

内容的提问来源于stack exchange,提问作者RGB Engineer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:20:18