在PHP 中, pack()函數是一種強大的工具,能夠將數據按照指定的格式打包成二進製字符串,廣泛用於數據傳輸、文件寫入以及網絡協議實現等場景。本文重點講解如何利用pack("C*")來對數組進行打包,解析其用法、實用技巧及常見應用。
pack()函數的基本語法如下:
string pack ( string $format , mixed ...$values )
其中, $format指定數據的打包格式,而"C"表示將參數轉換為無符號字符(即1 字節,範圍0~255)。 "C*"的意思是按無符號字符格式連續打包多個數值,適合將數組中每個元素作為單個字節依次編碼。
舉例:
$data = [65, 66, 67];
$packed = pack("C*", ...$data);
echo $packed; // 輸出 ABC
這段代碼中, 65對應ASCII 字符A , 66對應B , 67對應C ,所以最終輸出的是字符串"ABC" 。
將一個數字數組通過pack("C*")轉成二進制數據,一般步驟如下:
準備一個包含數值的數組,數組中的數值應在0 到255 之間。
使用參數拆包( ... )將數組作為多個參數傳給pack("C*") 。
pack()會把每個數字轉換為一個字節,並返回一個二進製字符串。
示例代碼:
<?php
$array = [72, 101, 108, 108, 111]; // 對應 "Hello"
$binary = pack("C*", ...$array);
echo $binary; // 輸出: Hello
?>
注意: pack()返回的是二進製字符串,不一定能直接用echo輸出,如果要以可視化的方式查看,可以用bin2hex()函數:
echo bin2hex($binary); // 48656c6c6f
如果數組為空,調用pack("C*", ...$array)會報錯。建議先判斷:
if (!empty($array)) {
$binary = pack("C*", ...$array);
} else {
$binary = '';
}
pack("C*")要求元素是0~255 的整數,否則會發生意想不到的結果。可以用array_map先做範圍限制:
$array = array_map(function($v) {
return $v & 0xFF; // 只保留最低8位元
}, $array);
打包數據常用於自定義網絡協議,可以把整數數組轉換為字節流,再發送到遠程服務器。
示例:
$data = [1, 2, 3, 4];
$packet = pack("C*", ...$data);
$socket = stream_socket_client("tcp://m66.net:1234");
fwrite($socket, $packet);
fclose($socket);
有時候需要寫入二進制格式文件,例如圖片頭信息、音視頻文件等。
$header = [0x89, 0x50, 0x4E, 0x47]; // PNG文件簽名
file_put_contents('file.png', pack("C*", ...$header));
自定義協議發送多個字段時,將數字轉換為字節流非常常見。
pack("C*")能把字節數組轉換成字符串,而unpack("C*", $str)則能實現逆操作,方便編碼解碼。
pack("C*")用於將整數數組按字節格式打包成二進製字符串。
數組元素需在0~255 之間,且應先檢查空數組。
適合網絡傳輸、文件寫入、協議開發等多種場景。
搭配unpack("C*")實現雙向轉換,處理字節數據更加靈活。
通過合理運用pack("C*") ,你可以高效地處理二進制數據,使PHP 在低層數據交互上表現得更加強大。