如何使用PHP修改二进制文件指定偏移的HEX值并生成新文件?
PHP修改二进制文件指定偏移量字节的正确方法
原代码的核心问题
- 文件打开模式错误:使用
'wb'模式会直接清空原文件内容并开启二进制写入,这是原文件内容丢失的根本原因。正确的读写模式应选用'rb+'——该模式保留原文件内容,支持任意位置读写,且以二进制方式处理文件。 - 字节转换错误:
dechex()返回的是十六进制字符串(比如dechex(90)得到"5a"),直接写入会生成两个ASCII字符,而非单个二进制字节。需用chr()或pack()将数值转为对应二进制字节。
针对需求的解决方案
需求:将File1.bin的第6个字节(原内容为06)修改为FF,生成File2.bin。
方法一:适合大文件(无需加载全部内容到内存)
$sourceFile = 'File1.bin'; $targetFile = 'File2.bin'; // 复制原文件到目标文件,避免修改源文件 copy($sourceFile, $targetFile); // 以读写二进制模式打开目标文件 $fileHandle = fopen($targetFile, 'rb+'); if ($fileHandle) { $targetOffset = 5; // 字节偏移量从0开始计数,第6个字节对应偏移量5 $newByte = chr(0xFF); // 将十六进制FF转为二进制字节(0xFF的十进制为255) fseek($fileHandle, $targetOffset); // 定位到目标偏移位置 fwrite($fileHandle, $newByte); // 写入单个字节 fclose($fileHandle); }
方法二:适合小文件(加载全部内容到内存修改)
$sourceFile = 'File1.bin'; $targetFile = 'File2.bin'; // 读取原文件的二进制内容 $fileContent = file_get_contents($sourceFile); if ($fileContent !== false) { $targetOffset = 5; $newByte = chr(0xFF); // 替换指定偏移量的字节 $fileContent[$targetOffset] = $newByte; // 写入新文件 file_put_contents($targetFile, $fileContent); }
额外说明
- 偏移量计数:二进制文件的偏移量从
0开始,因此第N个字节对应的偏移量为N-1。 - 多字节写入:如果需要写入多字节十六进制值,可使用
pack()函数,比如写入0x1234可写为pack('n', 0x1234)(n表示大端序双字节)。
内容的提问来源于stack exchange,提问作者Thomas Miller
相关产品推荐
相关产品推荐

