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

如何使用PHP修改二进制文件指定偏移的HEX值并生成新文件?

PHP修改二进制文件指定偏移量字节的正确方法

原代码的核心问题

  1. 文件打开模式错误:使用'wb'模式会直接清空原文件内容并开启二进制写入,这是原文件内容丢失的根本原因。正确的读写模式应选用'rb+'——该模式保留原文件内容,支持任意位置读写,且以二进制方式处理文件。
  2. 字节转换错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:46:04