PHP中pack unpack的詳細用法

2021-10-25 01:59:49 字數 3259 閱讀 5338

php中有兩個函式pack和unpack,很多phper在實際專案中從來沒有使用過,甚至也不知道這兩個方法是用來幹嘛的。這篇文章來為大家介紹一下它倆到底是用來幹啥的。
string pack ( string $format [, mixed $args [, mixed $... ]] )
該函式用來將對應的引數($args)打包成二進位制字串。

其中第乙個引數$format,有如下選項(可選引數很多,後面會選幾個常用的講解):

code

description

a以nul位元組填充字串空白

a以space(空格)填充字串

h十六進製制字串,低位在前

h十六進製制字串,高位在前

c有符號字元

c無符號字元

s有符號短整型(16位,主機位元組序)

s無符號短整型(16位,主機位元組序)

n無符號短整型(16位,大端位元組序)

v無符號短整型(16位,小端位元組序)

i有符號整型(機器相關大小位元組序)

i無符號整型(機器相關大小位元組序)

l有符號長整型(32位,主機位元組序)

l無符號長整型(32位,主機位元組序)

n無符號長整型(32位,大端位元組序)

v無符號長整型(32位,小端位元組序)

q有符號長長整型(64位,主機位元組序)

q無符號長長整型(64位,主機位元組序)

j無符號長長整型(64位,大端位元組序)

p無符號長長整型(64位,小端位元組序)

f單精度浮點型(機器相關大小)

d雙精度浮點型(機器相關大小)

xnul位元組

x回退一位元組

z以nul位元組填充字串空白(new in php 5.5)

@nul填充到絕對位置

這麼多引數看下來,我第一次是真心懵逼了,大部分說明都很好理解,但是其中的主機、大端、小端等位元組序是什麼鬼呢?接下裡的內容比較枯燥,但必須理解才行,堅持吧。

就是位元組的順序,說白了就是多位元組資料的存放順序(乙個位元組顯然不需要順序)。

比如ab分別對應的二進位制表示為0100 00010100 0010。對於儲存字串ab,我們可以0100 0001 0100 0010也可以0100 0010 0100 0001,這個順序就是所謂的位元組序。

比如字串ab,左高右低(我們正常的閱讀順序),a為高位元組,b為低位元組

假設0x123456是按從高位到底位的順序儲存,記憶體中是這樣存放的:

高位址 -> 低位址

12 -> 34 -> 56

大端就是將高位位元組放到記憶體的低位址端,低位位元組放到高位址端。網路傳輸中(比如tcp/ip)低位址端(高位位元組)放在流的開始,對於2個位元組的字串(ab),傳輸順序為:a(0-7bit)、b(8-15bit)。

那麼小端位元組序自然和大端相反。

表示當年機器的位元組序(也就是網路位元組序是確定的,而主機位元組序是依機器確定的),一般為小端位元組序。

$string = pack('a6', 'china');

var_dump($string); //輸出結果: string(6) "china",最後乙個位元組是不可見的nul

echo ord($string[5]); //輸出結果: 0(ascii碼中0對應的就是nul)

//a同理

$string = pack('a6', 'china');

var_dump($string); //輸出結果: string(6) "china ",最後乙個位元組是空格

echo ord($string[5]); //輸出結果: 32(ascii碼中32對應的就是空格)

附贈ascii表一張(linux/unix下可以使用man ascii檢視)

$string = pack('h3', 281);

var_dump($string); //輸出結果: string(2) "("

for($i=0;$i最後輸出本能應該覺得是67 68 -1

ord獲取的是字元的ascii碼(範圍0-255

),這時-1(0000 0001)對應的字元將以補碼的形式輸出也就是255(1111 1110 + 0000 0001 = 1111 1111)所有的整型型別使用方法完全一樣,主要注意它們的位和位元組序就可以了,下面以l作為例子展示

$string = pack('l', 123456789);

var_dump($string); //輸出:string(4) "�["

for($i=0;$if和d是針對浮點數打包,至於為什麼打包前是12345.123解包後是12345.123046875,這個和浮點數的儲存有關係,後面可以單開乙個文章講解一下ieee標準

$string = pack('x'); //打包乙個nul字串

echo ord($string); //輸出: 0

$string = pack('z2', 'abc5'); //其實就是將從z後面的數字位置開始,全部設定為nul

var_dump($string); //輸出:string(2) "a"

for($i=0;$iunpack的使用相當簡單,就是講pack打包的資料解包,打包的時候用的什麼引數,就用什麼引數解包,具體使用懶得說了,列幾個小例子

$string = pack('l4', 1, 2, 3, 4);

var_dump(unpack('l4', $string));

//輸出:

array(4)

$string = pack('l4', 1, 2, 3, 4);

var_dump(unpack('ll1/ll2/ll3/ll4', $string)); //可以指定key,用/分割

//輸出:

array(4)

PHP資料壓縮 加解密 pack, unpack

網路通訊 檔案儲存中經常需要交換資料,為了減少網路通訊流量 檔案儲存大小以及加密通訊規則,經常需要對資料進行雙向加解密以保證資料的安全。php中實現此功能主要需要使用的函式主要是pack及unpack函式 pack 壓縮資料到位字串之中。語法 string pack string format,mi...

php中mysql函式 PHP中的MySQL函式

本篇主要介紹採用php語言如何連線mysql資料庫。首先需要檢測服務mysql是否開啟成功。檢視phpinfo 函式 使用php運算元據庫的步驟 一 連線資料庫伺服器 二 選擇資料庫 mysql select db 資料庫名 三 設定編碼格式 mysql set charset utf 8 四 資料...

php中mysql的使用 PHP中MySQL的使用

連線到mysql mysql connect dbc mysql connect host,user,password 選擇當前資料庫 mysql select db database name mysql select db database name conn eg mysql select d...