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

十六进制字符串转二进制文件时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 07:54:02