首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 處理二進制數據:pack() 與 unpack() 完整指南及格式字符對照表

     編輯:PHP 綜合知識

核心函數

  • 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'=>..., ...]

格式字符完整對照表

字符含義備註
aNULL 填充字節串
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. 網絡協議封包 (大端序)

// 協議:版本(1字節) + 命令(2字節大端) + 長度(4字節大端) + 體
$packet = pack('C n N a*', 1, 100, strlen($body), $body);

2. 文件格式解析 (如 BMP 頭)

$header = unpack('vtype/Vsize/vreserved1/vreserved2/Voffset', $bin);
// type=0x4D42('BM'), size=文件大小, offset=數據偏移

3. 與 C 結構體交互

struct { uint32_t id; char name[32]; float score; }
$bin = pack('N a32 f', $id, $name, $score);
$data = unpack('Nid/a32name/fscore', $bin);

注意事項

  1. 字節序:跨平台/網絡通信必須使用 n/N (大端) 或 v/V (小端),避免機器序差異
  2. 長度匹配:unpack 格式字符總字節數必須 ≤ 二進制字符串長度
  3. a/A 填充行為不同:a 補 NULL,A 補空格
  4. 返回數組鍵名:格式字符後可加數字表示重複次數,解包鍵名自動加數字後綴 (string1, string2...)

總結

pack/unpack 是 PHP 處理二進制數據的核心工具,廣泛用於網絡協議、文件格式解析、C擴展交互、數據壓縮存儲。熟記格式字符含義與字節序選擇是正確使用的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved