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
相关产品推荐
相关产品推荐

