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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:56:12