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
相关产品推荐
相关产品推荐

