php pack 实现
PHP pack 函数概述
pack 函数用于将数据按照指定格式打包成二进制字符串。该函数在二进制数据处理、网络协议封装或文件格式生成等场景中非常实用。
基本语法
string pack ( string $format , mixed $args [, mixed $... ] )
$format:格式化字符串,指定如何打包数据。$args:待打包的数据,数量需与$format中的指令匹配。
常用格式指令
| 指令 | 说明 | 示例值 |
|---|---|---|
a |
以 NULL 填充的字符串 | "abc\0" |
A |
以空格填充的字符串 | "abc " |
h |
十六进制字符串(低位在前) | "1a2b" |
H |
十六进制字符串(高位在前) | "a1b2" |
c |
有符号字符 | 65 (-> 'A') |
C |
无符号字符 | 255 |
s |
有符号短整型(16位) | 1234 |
S |
无符号短整型(16位) | 65535 |
n |
无符号短整型(大端序) | 1234 |
v |
无符号短整型(小端序) | 1234 |
i |
有符号整型(依赖平台) | 123456 |
I |
无符号整型(依赖平台) | 123456 |
l |
有符号长整型(32位) | 123456 |
L |
无符号长整型(32位) | 123456 |
N |
无符号长整型(大端序) | 123456 |
V |
无符号长整型(小端序) | 123456 |
f |
单精度浮点数 | 3.14 |
d |
双精度浮点数 | 3.1415926 |
使用示例
打包字符串
$binary = pack('A5', 'hello'); // 输出 "hello"(右补空格)
$binary = pack('a5', 'hello'); // 输出 "hello\0"(右补 NULL)
打包整型数据
$binary = pack('s', 1234); // 小端序短整型
$binary = pack('n', 1234); // 大端序短整型
打包多个数据
$binary = pack('sNa10', 1234, 5678, 'test');
// 打包短整型(小端序)、长整型(大端序)和字符串
十六进制数据处理
$binary = pack('H*', '48656c6c6f'); // 解码为 "Hello"
实际应用场景
网络协议封装
// 构造一个简单的协议头:类型(1字节) + 长度(2字节)
$type = 1;
$data = "payload";
$header = pack('Cn', $type, strlen($data));
$packet = $header . $data;
二进制文件生成
// 生成 BMP 文件头(部分示例)
$header = pack('vVvV', 19778, 54, 0, 0); // BM 标识 + 文件大小等
注意事项
- 格式字符串中的指令数量必须与参数数量严格匹配。
- 大端序(
n,N)适用于网络传输,小端序(v,V)适用于多数本地系统。 - 使用
*可以重复格式指令直到参数用完(如pack('C*', ...))。 - 解包操作需使用
unpack函数,其格式与pack类似。
通过合理使用 pack 函数,可以实现高效的二进制数据生成与处理。







