使用strtol/atoi等函数转换十六进制数组时始终返回0的问题
十六进制数组转整数问题排查与解决
问题描述
开发需读写十六进制值的文件解析程序时,遇到如下问题:需要将{0x00, 0x01}这类十六进制字节数组转换为单个整数(如0x0001对应十进制值1),但使用strtol()、atoi()、sscanf()等字符串转整数函数时,返回结果始终为0。
测试代码
#include <stdio.h> #include <string.h> int main() { signed char data[] = {0x00, 0x01}; signed char res; res = strtol((char *)data, NULL, 16); printf("RES: %d", res); return 0; }
尝试过的方法
- 改用
atoi()、sscanf()函数进行转换 - 更换变量的数据类型
以上尝试均未解决问题,结果仍为0。
预期与实际结果
- 预期结果:输出
VALUE: 1 - 实际结果:输出
VALUE: 0
问题分析与解决方法
核心问题是混淆了原始数值与ASCII码的区别:strtol()这类函数处理的是字符串形式的十六进制字符(比如字符'0'对应ASCII码0x30,字符'1'对应ASCII码0x31),而你传入的是原始十六进制数值0x00、0x01,这些数值对应不可见字符,函数无法识别为有效十六进制字符串,因此返回0。
正确的做法是直接通过位运算将字节数组拼接为整数,无需依赖字符串转换函数。示例代码如下:
#include <stdio.h> int main() { signed char data[] = {0x00, 0x01}; // 小端序拼接:高字节在前,低字节在后 int res = (data[0] << 8) | (data[1] & 0xFF); printf("VALUE: %d", res); return 0; }
如果是大端序,只需调整字节拼接顺序:
int res = (data[1] << 8) | (data[0] & 0xFF);
内容的提问来源于stack exchange,提问作者Primitive
相关产品推荐
相关产品推荐

