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免费学习笔记(深入)”;