C语言如何将十六进制字符串转换为对应值写入二进制文件
问题原因
你当前的代码是把解析得到的数值格式化为了带\x前缀的可读字符串,实际写入文件的是这些字符对应的ASCII编码,不是你需要的二进制字节本身:
你生成的字符串
\x46ab对应的ASCII字节就是你观测到的5C 78 34 36 61,和预期的二进制字节完全不符。
优雅实现方案
核心逻辑是直接写入二进制字节,同时可以手动控制字节顺序,不受运行平台大小端影响:
#include <stdio.h> #include <stdlib.h> #include <stdint.h> int main(int argc, char *argv[]) { if (argc < 4) return 1; char *fpath = argv[3]; FILE *f = fopen(fpath, "wb+"); if (!f) { perror("文件打开失败"); return 1; } // 输入的十六进制字符串 char *input = "46AB"; // 转换为无符号16位整数,避免符号位异常 uint16_t hex_val = (uint16_t)strtoul(input, NULL, 16); // 定位到偏移2的写入位置 fseek(f, 2, SEEK_SET); // 手动拆分字节,严格按大端序(和输入字符串顺序一致:46在前,AB在后)写入 uint8_t write_buf[2] = { (hex_val >> 8) & 0xFF, // 取高8位 hex_val & 0xFF // 取低8位 }; fwrite(write_buf, sizeof(write_buf), 1, f); // 如果需要小端序(AB在前,46在后),可以替换上面三行为: // fwrite(&hex_val, sizeof(hex_val), 1, f); fclose(f); return 0; }
方案说明
- 用
stdint.h提供的定长整数类型,避免不同平台基础类型长度不一致带来的兼容性问题 - 手动拆分字节的写法可以完全控制输出的字节顺序,适合跨平台二进制文件写入场景
- 直接用
fwrite写入二进制数据,不经过字符串格式化环节,性能更高也不会出现额外字符的问题
内容的提问来源于stack exchange,提问作者JackNewman
相关产品推荐
相关产品推荐

