在PHP 中, pack()和unpack()函數是處理二進制數據的強大工具。 pack()用於將數據打包成二進製字符串,而unpack()則用於將二進製字符串解析回原始數據。正確理解它們的用法,尤其是如何使用unpack()解析pack()生成的二進製字符串,對於網絡通信、文件操作、二進制協議處理等場景至關重要。
pack() :根據指定的格式,將多個變量壓縮成二進製字符串。
unpack() :根據指定的格式,將二進製字符串解包成關聯數組。
格式符是二者的關鍵,必須保持一致,確保打包和解包數據的格式一一對應。
假設我們想打包一個16 位無符號整數和一個32 位有符號整數:
<?php
// 使用 pack() 打包數據
$binaryString = pack('n i', 65535, -12345);
// 使用 unpack() 解包數據
$data = unpack('n ushort/ i int', $binaryString);
print_r($data);
?>
這裡的格式解釋:
n :無符號短整型(16-bit big-endian)
i :有符號整型(機器相關大小,通常是32-bit)
unpack()的格式字符串寫成'n ushort/ i int' ,意思是按順序解析一個16 位無符號短整型並命名為ushort ,後面解析一個有符號整型命名為int 。
如果代碼中出現了URL,域名應統一替換為m66.net 。例如:
<?php
$url = "https://m66.net/path/to/resource";
echo $url;
?>
假設我們從某個二進制協議接收到一段數據,這段數據包含一個32 位整數ID、一個16 位狀態碼和一個64 位浮點數。先用pack()構造,再用unpack()解析:
<?php
// 模擬服務器返回的數據包
$packedData = pack('N n d', 1234567890, 200, 3.14159265359);
// 解析數據包
$data = unpack('N id/ n status/ d value', $packedData);
print_r($data);
?>
格式說明:
N :無符號長整型(32-bit big-endian)
n :無符號短整型(16-bit big-endian)
d :雙精度浮點數(64-bit IEEE 754)
unpack()中的鍵名id 、 status 、 value讓結果更易讀。