本文目录导读:

在 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 中处理二进制文件的绝大多数场景,根据你的具体需求选择合适的方法即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播