當前位置: 首頁> 最新文章列表> pack("C*") 與數組打包的實用技巧

pack("C*") 與數組打包的實用技巧

M66 2025-05-29

在PHP 中, pack()函數是一種強大的工具,能夠將數據按照指定的格式打包成二進製字符串,廣泛用於數據傳輸、文件寫入以及網絡協議實現等場景。本文重點講解如何利用pack("C*")來對數組進行打包,解析其用法、實用技巧及常見應用。


什麼是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 字符A66對應B67對應C ,所以最終輸出的是字符串"ABC"


如何用pack("C*") 進行數組打包?

將一個數字數組通過pack("C*")轉成二進制數據,一般步驟如下:

  1. 準備一個包含數值的數組,數組中的數值應在0 到255 之間。

  2. 使用參數拆包( ... )將數組作為多個參數傳給pack("C*")

  3. pack()會把每個數字轉換為一個字節,並返回一個二進製字符串。

示例代碼:

 <?php
$array = [72, 101, 108, 108, 111]; // 對應 "Hello"
$binary = pack("C*", ...$array);

echo $binary; // 輸出: Hello
?>

注意: pack()返回的是二進製字符串,不一定能直接用echo輸出,如果要以可視化的方式查看,可以用bin2hex()函數:

 echo bin2hex($binary); // 48656c6c6f

實用技巧

1. 數組為空時的處理

如果數組為空,調用pack("C*", ...$array)會報錯。建議先判斷:

 if (!empty($array)) {
    $binary = pack("C*", ...$array);
} else {
    $binary = '';
}

2. 數組元素超出範圍

pack("C*")要求元素是0~255 的整數,否則會發生意想不到的結果。可以用array_map先做範圍限制:

 $array = array_map(function($v) {
    return $v & 0xFF; // 只保留最低8位元
}, $array);

3. 結合網絡數據包

打包數據常用於自定義網絡協議,可以把整數數組轉換為字節流,再發送到遠程服務器。

示例:

 $data = [1, 2, 3, 4];
$packet = pack("C*", ...$data);
$socket = stream_socket_client("tcp://m66.net:1234");
fwrite($socket, $packet);
fclose($socket);

典型應用場景

1. 二進製文件寫入

有時候需要寫入二進制格式文件,例如圖片頭信息、音視頻文件等。

 $header = [0x89, 0x50, 0x4E, 0x47]; // PNG文件簽名
file_put_contents('file.png', pack("C*", ...$header));

2. 網絡協議數據編碼

自定義協議發送多個字段時,將數字轉換為字節流非常常見。

3. 字符串與字節數組轉換

pack("C*")能把字節數組轉換成字符串,而unpack("C*", $str)則能實現逆操作,方便編碼解碼。


總結

  • pack("C*")用於將整數數組按字節格式打包成二進製字符串。

  • 數組元素需在0~255 之間,且應先檢查空數組。

  • 適合網絡傳輸、文件寫入、協議開發等多種場景。

  • 搭配unpack("C*")實現雙向轉換,處理字節數據更加靈活。

通過合理運用pack("C*") ,你可以高效地處理二進制數據,使PHP 在低層數據交互上表現得更加強大。