本文目录导读:

在 PHP 中操作二进制文件有几种常见方法,我来详细介绍一下:
读取二进制文件
使用 fopen() 和 fread()
// 打开二进制文件
$handle = fopen('file.bin', 'rb'); // 'rb' 模式很重要
if ($handle) {
// 读取前100字节
$data = fread($handle, 100);
fclose($handle);
// 读取整个文件
$content = file_get_contents('file.bin');
}
使用 file_get_contents()
// 读取整个二进制文件
$binaryData = file_get_contents('image.jpg');
写入二进制文件
// 写入二进制数据
$data = "\x00\x01\x02\x03"; // 十六进制表示
file_put_contents('output.bin', $data);
// 使用 fopen
$handle = fopen('output.bin', 'wb');
fwrite($handle, $data);
fclose($handle);
解析二进制数据
使用 unpack()
// 解析二进制数据
$data = file_get_contents('data.bin');
// 格式说明:
// C = 无符号字符(1字节)
// v = 无符号短整型(2字节,小端)
// V = 无符号长整型(4字节,小端)
// N = 无符号长整型(4字节,大端)
// L = 无符号长整型(4字节)
$unpacked = unpack('Cuint8/vint16/Vuint32', $data);
print_r($unpacked);
使用 pack()
// 创建二进制数据
$data = pack('CvV', 255, 65535, 4294967295);
file_put_contents('output.bin', $data);
// 组合多个数据
$packed = pack('C3', 1, 2, 3); // 3个无符号字符
$packed .= pack('v5', 100, 200, 300, 400, 500); // 5个短整型
高级二进制操作
逐字节处理
$file = fopen('file.bin', 'rb');
$byte = fread($file, 1);
while ($byte !== false && !feof($file)) {
// 处理每个字节
echo ord($byte) . " "; // 获取字节的整数值
$byte = fread($file, 1);
}
fclose($file);
使用 SplFileObject
$file = new SplFileObject('data.bin', 'rb');
$file->seek(10); // 跳过前10字节
while (!$file->eof()) {
$byte = $file->fread(4); // 每次读取4字节
$number = unpack('V', $byte); // 解析为32位整数
var_dump($number);
}
完整示例:读取二进制文件头
function readBinaryHeader($filename) {
$file = fopen($filename, 'rb');
if (!$file) {
return false;
}
// 读取文件头(假设前4字节是魔数,接下来4字节是版本号)
$header = fread($file, 8);
fclose($file);
// 解析数据
$magicNumber = unpack('L', substr($header, 0, 4));
$version = unpack('L', substr($header, 4, 4));
return [
'magic' => dechex($magicNumber[1]),
'version' => $version[1]
];
}
注意事项
// 1. 二进制模式标志
$file = fopen('file.bin', 'rb'); // 读取
$file = fopen('file.bin', 'wb'); // 写入
$file = fopen('file.bin', 'ab'); // 追加
// 2. 检查文件大小
$size = filesize('file.bin');
$data = fread($file, $size);
// 3. 错误处理
try {
$data = file_get_contents('file.bin');
if ($data === false) {
throw new Exception("无法读取文件");
}
} catch (Exception $e) {
echo "错误: " . $e->getMessage();
}
// 4. 大文件处理(使用流)
$handle = fopen('largefile.bin', 'rb');
$chunkSize = 8192; // 8KB 块大小
while (!feof($handle)) {
$chunk = fread($handle, $chunkSize);
// 处理数据块
}
fclose($handle);
常用格式字符
| 格式 | 含义 | 字节数 |
|---|---|---|
| C | 无符号字符 | 1 |
| c | 有符号字符 | 1 |
| S/v | 无符号短整型(小端) | 2 |
| s | 有符号短整型 | 2 |
| L/V | 无符号长整型(小端) | 4 |
| l | 有符号长整型 | 4 |
| F | 浮点数 | 4 |
| D | 双精度浮点数 | 8 |
这些方法覆盖了 PHP 中处理二进制文件的绝大多数场景,根据你的具体需求选择合适的方法即可。