在PHP 中, pack()和unpack()函數常用於處理二進制數據,尤其適合在網絡通信、文件讀寫、數據編碼等需要精確控製字節的場景中使用。本文將詳細講解這兩個函數的用法,並附上完整的格式碼對照表,幫助你更高效地處理二進制數據。
pack() :將數據打包成二進製字符串。
unpack() :將二進製字符串解包成PHP 數組。
兩者使用格式碼(format code)來定義數據的結構,這些格式碼決定瞭如何編碼/解碼數據的方式。
$data = pack("C*", 72, 101, 108, 108, 111); // 將 ASCII 碼轉換成字符串 "Hello"
echo $data; // 輸出: Hello
文法:
string pack(string $format, mixed $values...)
$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 = "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()一起使用,調試更方便。