PHP 中有一個非常有用的函數,名為pack()
和unpack()
,它們可以將指定格式的數據轉換為二進制字符串或者將二進制字符串轉換為指定格式的數據。這在數據傳輸、數據存儲時非常有用,因為通常情況下二進制數據(0 和 1)比 ASCII 字符更容易傳輸和存儲。
舉個例子,如果我們要將一個無符號整數(32位)轉換為二進制字符串,可以使用以下代碼:
$num = 1234567890; $packed = pack("L", $num); echo bin2hex($packed); // 輸出: "d202964e"
在pack()
中,格式字符串 "L" 表示一個無符號整數(32位)。接著傳入待轉換的數字 $num,pack()
函數會將它轉換為二進制字符串并存儲在 $packed 中。最后,bin2hex()
函數將二進制字符串轉換為 16 進制字符串并輸出。
相應地,如果我們有一個 16 進制字符串,想要將它轉換為無符號整數,可以使用以下代碼:
$hex = "d202964e"; $unpacked = unpack("L", hex2bin($hex)); echo $unpacked[1]; // 輸出: 1234567890
在unpack()
中,同樣使用格式字符串 "L" 表示一個無符號整數(32位)。我們將 16 進制字符串 "d202964e" 轉換為二進制字符串并傳入unpack()
,然后它會解析二進制字符串并將結果存儲在數組 $unpacked 中。需要注意的是,$unpacked 是一個數組,而不是單值。這是因為unpack()
可以同時解析多個值。
除了無符號整數之外,pack()
和unpack()
函數還支持許多其他格式,包括整數、浮點數、布爾值、字符串等等。下面是一些例子:
整數:
$num1 = 123; $num2 = -123; $packed1 = pack("s", $num1); $packed2 = pack("s", $num2); $unpacked1 = unpack("s", $packed1); $unpacked2 = unpack("s", $packed2); echo $unpacked1[1].", ".$unpacked2[1]; // 輸出: "123, -123"
浮點數:
$float1 = 3.1415926; $float2 = -1234.5678; $packed1 = pack("f", $float1); $packed2 = pack("f", $float2); $unpacked1 = unpack("f", $packed1); $unpacked2 = unpack("f", $packed2); echo $unpacked1[1].", ".$unpacked2[1]; // 輸出: "3.141592502594, -1234.5677490234"
布爾值:
$bool1 = true; $bool2 = false; $packed1 = pack("C", $bool1); $packed2 = pack("C", $bool2); $unpacked1 = unpack("C", $packed1); $unpacked2 = unpack("C", $packed2); echo $unpacked1[1].", ".$unpacked2[1]; // 輸出: "1, 0"
總之,pack()
和unpack()
是兩個非常有用的 PHP 函數,它們可以幫助我們在數據傳輸和存儲時更高效地處理二進制數據。