PHP中pack()用于将结构化数据按指定字节布局序列化为原始二进制流写入.bin文件,供C程序或嵌入式设备使用;不可用于编译PHP源码。

PHP里用pack()生成二进制文件,不是“转整个PHP文件”
很多人搜“PHP文件转二进制”,其实是想把PHP里的结构化数据(比如数组、数值、字符串)按指定字节布局写成.bin文件,供C程序、嵌入式设备或协议解析使用。PHP源码本身(.php)不能也不该被“转成二进制执行文件”——那是编译器的事。pack()干的是序列化为**原始字节流**,不是编译。
pack()格式字符串怎么选:对齐、符号、大小端是关键
格式字符直接决定二进制内容,错一个就全乱。常见坑:
-
"N"(无符号长整型,大端)和"V"(小端)混用会导致跨平台读取失败 -
"i"是有符号整型,依赖系统int长度(通常是4字节),但"l"更明确表示4字节有符号长整型 -
"a10"写10字节定长字符串,末尾自动补\0;"A10"会截断并右对齐,不补零——协议交互时必须按规范选 - 结构体字段之间若需对齐(比如C里
struct的__attribute__((packed))),得手动用x填充,例如"NxxC"表示1个大端uint32 + 2字节空隙 + 1个uint8
写入.bin文件要绕开文本模式换行转换
Windows下用fopen($file, "w")可能触发CR-LF转换,破坏二进制。必须用二进制模式:
file_put_contents('data.bin', pack('N3a5', 123, 456, 789, 'hello'), LOCK_EX);
或者显式打开:
立即学习“PHP免费学习笔记(深入)”;
$fp = fopen('data.bin', 'wb'); // 注意 'wb',不是 'w'
fwrite($fp, pack('f', 3.14159));
fclose($fp);
用file_put_contents()最省事,但注意它默认覆盖;追加要用FILE_APPEND标志。
读取时用unpack()要严格匹配pack()的格式
unpack()不是万能反向函数,它返回关联数组,键名必须和格式字符串里的一致:
$data = file_get_contents('data.bin');
$parsed = unpack('Nid/Ntimestamp/a5name', $data);
// 得到 ['id'=>123, 'timestamp'=>456, 'name'=>'hello']
常见错误:
- 格式串里用了
"Nid",但unpack()写成"NID"(大小写敏感)→ 返回空数组 - 读取长度不够(比如
pack('N3', ...)生成12字节,但只读了10字节)→unpack()静默失败,返回false - 用
"c"读无符号字节却期望值 > 127 → 实际得到负数(因为c是有符号字符),应改用"C"
调试时先用bin2hex($data)看十六进制,比盲目猜格式靠谱得多。











