十六进制字符串转二进制文件时PDF等格式文件损坏无法打开问题
十六进制转PDF文件损坏解决方案
故障根因
现有转换逻辑仅处理了0x前缀,没有覆盖二进制文件转换的所有边界场景,常见诱因如下:
- 十六进制字符串中夹杂多余字符:从数据库或复制来源中可能附带换行、空格、制表符等非十六进制字符,
hex2bin遇到无效字符会返回异常或截断内容 - 十六进制串长度非偶数:
hex2bin要求输入长度必须为偶数,否则会自动丢弃最后一位,导致二进制结构不完整 - Windows系统换行符自动转换:默认写入文件时Windows会将
\n替换为\r\n,直接破坏PDF的二进制结构 - 额外输出内容污染:若PHP脚本存在BOM头、提前输出的调试信息,也会写入文件导致损坏
修复后代码
// 1. 全量清洗十六进制字符串,移除所有非十六进制字符 $cleanHex = preg_replace('/[^0-9a-fA-F]/', '', $hexPdfString); // 2. 移除可选的0x前缀 if (substr($cleanHex, 0, 2) === '0x') { $cleanHex = substr($cleanHex, 2); } // 3. 补全长度为偶数,避免hex2bin截断 if (strlen($cleanHex) % 2 !== 0) { $cleanHex = '0' . $cleanHex; } // 4. 转换为二进制内容 $binaryPdf = hex2bin($cleanHex); // 5. 二进制模式写入文件,加锁避免并发写入异常 file_put_contents('document.pdf', $binaryPdf, LOCK_EX | FILE_BINARY);
注:上述代码兼容PHP5.4及以上版本,无需依赖高版本语法。
验证方法
- 转换前核对清洗后的十六进制串长度:正常长度应为原始PDF文件字节数的2倍,若长度偏短说明数据库读取时存在截断
- 转换后用文本编辑器打开PDF文件查看开头:正常应该以
%PDF-1.开头,若开头存在其他字符说明脚本有额外输出 - 查看PDF结尾:正常应该以
%%EOF结尾,若缺失说明十六进制串本身不完整
内容的提问来源于stack exchange,提问作者Samuel Gfeller
相关产品推荐
相关产品推荐

