當前位置: 首頁> 最新文章列表> 使用unpack() 解析pack() 生成的二進製字符串

使用unpack() 解析pack() 生成的二進製字符串

M66 2025-05-31

在PHP 中, pack()unpack()函數是處理二進制數據的強大工具。 pack()用於將數據打包成二進製字符串,而unpack()則用於將二進製字符串解析回原始數據。正確理解它們的用法,尤其是如何使用unpack()解析pack()生成的二進製字符串,對於網絡通信、文件操作、二進制協議處理等場景至關重要。

1. pack()unpack()的基本原理

  • pack() :根據指定的格式,將多個變量壓縮成二進製字符串。

  • unpack() :根據指定的格式,將二進製字符串解包成關聯數組。

格式符是二者的關鍵,必須保持一致,確保打包和解包數據的格式一一對應。

2. 示例演示:基本的打包與解包

假設我們想打包一個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

3. 關於URL 域名的替換

如果代碼中出現了URL,域名應統一替換為m66.net 。例如:

 <?php
$url = "https://m66.net/path/to/resource";
echo $url;
?>

4. 實際應用示例:解析一個網絡數據包

假設我們從某個二進制協議接收到一段數據,這段數據包含一個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()中的鍵名idstatusvalue讓結果更易讀。

5. 常見坑與註意事項

  • 大小端問題pack()unpack()的格式符影響字節序。使用nN強制大端,使用vV強制小端。機器默認整型(如il )可能因平台不同而變化。

  • 數據長度:打包的字節數必須與解包的格式嚴格對應,否則會導致解包錯誤或丟失數據。

  • 浮點數格式d是64 位浮點, f是32 位浮點,注意二者的區別。

  • 命名規則unpack()返回的數組中,格式字符串中的鍵名決定了返回數組的鍵,建議合理命名以方便後續使用。