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

C语言写入PDF二进制数据字面量后文件损坏的解决方法

问题分析与解决方案

你的代码核心问题是错误地将PDF二进制字节以字符串形式存储并写入:docDat里的"0x25,0x50..."是文本字符,直接用fprintf写入时,文件里实际存储的是这些文本内容,而非PDF需要的原始二进制数据,导致文件损坏。

以下是两种可行的修复方案:

方案1:直接存储原始二进制字节(推荐)

将PDF的十六进制字节转换为unsigned char数组的元素,用fwrite写入二进制数据:

#include <stdio.h>

int main(){
    // 用unsigned char数组存储PDF原始二进制字节,去掉引号和逗号,每个0xXX作为单个字节
    unsigned char docDat[] = {
        0x25,0x50,0x44,0x46,0x2D,0x31,0x2E,0x36,0x0A,0x25,0xC3,0xA4,0xC3,0xBC,
        0xC3,0xB6,0xC3,0x9F,0x0A,0x32,0x20,0x30,0x20,0x6F,0x62,0x6A,0x0A,0x3C,
        0x3C,0x2F,0x4C,0x65,0x6E,0x67,0x74,0x68,0x20,0x33,0x20,0x30,0x20,0x52,
        0x2F,0x46,0x69,0x6C,0x74,0x65,0x72,0x2F,0x46,0x6C,0x61,0x74,0x65,0x44,
        0x65 // 补全剩余的PDF字节
    };
    size_t datLen = sizeof(docDat) / sizeof(docDat[0]);

    FILE *fp = fopen("sample.pdf", "wb");
    if (fp != NULL) {
        // fwrite专门用于二进制数据写入,确保字节原样存储
        fwrite(docDat, sizeof(unsigned char), datLen, fp);
        fclose(fp);
    }
    return 0;
}

方案2:解析现有字符串格式的字节

如果已经有了逗号分隔的十六进制字符串,可先解析每个值为二进制字节再写入:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char docDat[] = "0x25,0x50,0x44,0x46,0x2D,0x31,0x2E,0x36,0x0A,0x25,0xC3,0xA4,0xC3,0xBC,0xC3,0xB6,0xC3,0x9F,0x0A,0x32,0x20,0x30,0x20,0x6F,0x62,0x6A,0x0A,0x3C,0x3C,0x2F,0x4C,0x65,0x6E,0x67,0x74,0x68,0x20,0x33,0x20,0x30,0x20,0x52,0x2F,0x46,0x69,0x6C,0x74,0x65,0x72,0x2F,0x46,0x6C,0x61,0x74,0x65,0x44,0x65";
    
    FILE *fp = fopen("sample.pdf", "wb");
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    // 分割字符串并解析每个十六进制值
    char *token = strtok(docDat, ",");
    while (token != NULL) {
        unsigned char byte = (unsigned char)strtol(token, NULL, 16);
        fwrite(&byte, sizeof(unsigned char), 1, fp);
        token = strtok(NULL, ",");
    }

    fclose(fp);
    return 0;
}

关键注意事项

  • 存储二进制数据必须用unsigned char数组,而非字符串形式的十六进制文本。
  • 写入二进制文件必须使用fwrite,fprintf是文本输出函数,会将数据转换为字符写入。
  • 始终用wb模式打开文件,避免系统自动转换换行符等二进制数据(Windows系统下尤为重要)。

内容的提问来源于stack exchange,提问作者user22199283

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:44:53