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填充到絕對位置
這麼多引數看下來,我第一次是真心懵逼了,大部分說明都很好理解,但是其中的主機、大端、小端等位元組序是什麼鬼呢?接下裡的內容比較枯燥,但必須理解才行,堅持吧。
就是位元組的順序,說白了就是多位元組資料的存放順序(乙個位元組顯然不需要順序)。
比如a
和b
分別對應的二進位制表示為0100 0001
、0100 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...