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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:06:01