pack(format, ...values):將數據打包為二進制字符串unpack(format, binary_string):解包二進制字符串為關聯數組// 打包兩個無符號長整型 (32位)
$bin = pack('LL', 0, 1);
// 打包單個無符號字符
$bin = pack('C', 65); // 'A'
// 解包:讀取第一個字節
$arr = unpack('Chead', $bin); // ['head' => 65]
// 解包多字段:斜槓分隔
$arr = unpack('Chead/C3string/C4number', $bin);
// 讀取 1+3+4=8 字節,返回 ['head'=>..., 'string1'=>..., 'string2'=>..., 'string3'=>..., 'number1'=>..., ...]
| 字符 | 含義 | 備註 |
|---|---|---|
| a | NULL 填充字節串 | |
| A | 空格填充字節串 | |
| h | 十六進制,低位在前 | |
| H | 十六進制,高位在前 | |
| c | 有符號字符 | 1 字節 |
| C | 無符號字符 | 1 字節 |
| s | 有符號短整型 | 2 字節,機器字節序 |
| S | 無符號短整型 | 2 字節,機器字節序 |
| n | 無符號短整型 | 2 字節,大端序 (網絡序) |
| v | 無符號短整型 | 2 字節,小端序 |
| i | 有符號整型 | 機器相關大小/序 |
| I | 無符號整型 | 機器相關大小/序 |
| l | 有符號長整型 | 4 字節,機器字節序 |
| L | 無符號長整型 | 4 字節,機器字節序 |
| N | 無符號長整型 | 4 字節,大端序 |
| V | 無符號長整型 | 4 字節,小端序 |
| f | 浮點數 | 機器相關 |
| d | 雙精度浮點 | 機器相關 |
| x | 空字節 (跳過) | |
| X | 回退一字節 | |
| @ | NULL 填充到絕對位置 |
// 協議:版本(1字節) + 命令(2字節大端) + 長度(4字節大端) + 體
$packet = pack('C n N a*', 1, 100, strlen($body), $body);
$header = unpack('vtype/Vsize/vreserved1/vreserved2/Voffset', $bin);
// type=0x4D42('BM'), size=文件大小, offset=數據偏移
struct { uint32_t id; char name[32]; float score; }
$bin = pack('N a32 f', $id, $name, $score);
$data = unpack('Nid/a32name/fscore', $bin);
n/N (大端) 或 v/V (小端),避免機器序差異unpack 格式字符總字節數必須 ≤ 二進制字符串長度a/A 填充行為不同:a 補 NULL,A 補空格string1, string2...)pack/unpack 是 PHP 處理二進制數據的核心工具,廣泛用於網絡協議、文件格式解析、C擴展交互、數據壓縮存儲。熟記格式字符含義與字節序選擇是正確使用的關鍵。