當前位置: 首頁> 最新文章列表> PHP 的pack() 函數和unpack() 格式碼怎麼用?完整對照表一覽

PHP 的pack() 函數和unpack() 格式碼怎麼用?完整對照表一覽

M66 2025-05-26

在PHP 中, pack()unpack()函數常用於處理二進制數據,尤其適合在網絡通信、文件讀寫、數據編碼等需要精確控製字節的場景中使用。本文將詳細講解這兩個函數的用法,並附上完整的格式碼對照表,幫助你更高效地處理二進制數據。

一、 pack()unpack()是什麼?

  • pack() :將數據打包成二進製字符串。

  • unpack() :將二進製字符串解包成PHP 數組。

兩者使用格式碼(format code)來定義數據的結構,這些格式碼決定瞭如何編碼/解碼數據的方式。

二、 pack()函數用法

$data = pack("C*", 72, 101, 108, 108, 111); // 將 ASCII 碼轉換成字符串 "Hello"
echo $data; // 輸出: Hello

文法:

 string pack(string $format, mixed $values...)

三、 unpack()函數用法

$data = "Hello";
$result = unpack("C*", $data);
print_r($result);

輸出:

 Array
(
    [1] => 72
    [2] => 101
    [3] => 108
    [4] => 108
    [5] => 111
)

文法:

 array unpack(string $format, string $data, int $offset = 0)

四、常用格式碼對照表

格式碼說明字節長度大小端
a NUL 填充字符串(不去除NUL)指定長度
A空格填充字符串(會去除尾部空格)指定長度
h十六進製字符串,每個字符表示4 bits每兩位= 1 byte
H大寫十六進制,每個字符表示4 bits每兩位= 1 byte
c有符號字符(8 位) 1 字節
C無符號字符(8 位) 1 字節
s有符號短整型(16 位) 2 字節主機字節序
S無符號短整型(16 位) 2 字節主機字節序
n無符號短整型(16 位),網絡字節序2 字節大端
v無符號短整型(16 位),小端字節序2 字節小端
i有符號整數(機器相關) 4 字節或8 字節主機字節序
I無符號整數(機器相關) 4 字節或8 字節主機字節序
l有符號長整型(32 位) 4 字節主機字節序
L無符號長整型(32 位) 4 字節主機字節序
N無符號長整型(32 位),網絡字節序4 字節大端
V無符號長整型(32 位),小端字節序4 字節小端
f單精度浮點數(32 位) 4 字節主機字節序
d雙精度浮點數(64 位) 8 字節主機字節序
x填充字節(跳過1 個字節) 1 字節
X回退1 個字節1 字節
@設置絕對位置(跳過/回退到某位置)可變

五、實際應用示例

網絡通信:IP 地址轉換

$ip = "192.168.1.1";
$packed = pack("C4", ...explode('.', $ip));
echo bin2hex($packed); // 輸出 c0a80101

$unpacked = unpack("C4", $packed);
echo implode('.', $unpacked); // 輸出 192.168.1.1

二進制協議解析(例如讀取文件頭)

 $binary = file_get_contents("https://m66.net/example/file.bin");
$header = unpack("a4signature/Nsize", $binary);
print_r($header);

六、格式碼的數量修飾符

格式碼可以用數量修飾,例如:

  • C4 :表示4 個無符號字符

  • A10 :表示10 個字符的空格填充字符串

  • @8 :跳轉到第8 字節位置

你也可以使用*表示盡可能多地讀取:

 $data = unpack("C*", "Hello"); // 讀取所有字節

七、總結

PHP 的pack()unpack()是強大的二進制處理工具,熟悉其格式碼和用法可以幫助你更靈活地處理底層數據。無論是在解析協議、存儲結構化數據,還是構建高效網絡通信協議,這兩個函數都是非常實用的工具。

格式碼雖然多,但掌握常用的幾種(如C , n , N , f , d )即可滿足大多數需求。建議在開發中配合bin2hex()hex2bin()一起使用,調試更方便。