php pack unpack二進位製流介面應用例項

2022-08-29 03:00:13 字數 4005 閱讀 9945

在工作中,我也逐漸了解到pack,unpack,ord對於二進位制位元組處理的強大。 下面我逐一介紹它們。在我們工作中,用到它們的估計不多。 我在最近乙個工作中,因為通訊需要用到二進位製流,然後介面用php接收。當時在處理時候,查閱不少資料。因為它們使用確實比較少,也很少朋友工作中會用到它們。 在工作中,我也逐漸了解到pack,unpack,ord對於二進位制位元組處理的強大。 下面我逐一介紹它們。

pacrk函式說明:本函式用來將資料壓縮打包到位的字串之中。

語法:pack(format,args+)

引數描述

format

必需。規定在包裝資料時所使用的格式。

args+

可選。規定被包裝的乙個或多個引數。

字元

說明

a將字串空白以 null 字元填滿

a將字串空白以 space 字元 (空格) 填滿

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

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

c有號字元

c無號字元

s有號短整數 (十六位,依計算機的位順序)

s無號短整數 (十六位,依計算機的位順序)

n無號短整數 (十六位, 高位在後的順序)

v無號短整數 (十六位, 低位在後的順序)

i有號整數 (依計算機的順序及範圍)

i無號整數 (依計算機的順序及範圍)

l有號長整數 (卅二位,依計算機的位順序)

l無號長整數 (卅二位,依計算機的位順序)

n無號短整數 (卅二位, 高位在後的順序)

v無號短整數 (卅二位, 低位在後的順序)

f單精確浮點數 (依計算機的範圍)

d倍精確浮點數 (依計算機的範圍)x空位

x倒回一位

@填入 null 字元到絕對位置

unpack函式說明:本函式用來將位的字串的資料解壓縮

語法:unpack(format,args+)

引數描述

format

必需。規定在包裝資料時所使用的格式。

args+

可選。規定被包裝的乙個或多個引數。

引數與pack相同。

ord函式說明:返回對應字元的acill碼值

語法:ord($character);

例項說明:

<?php 

//a字元 

$str=(pack("a*", "中國")); 

echo $str,"=",strlen($str),"位元組\n"; 

getascill($str); 

//h字元 

$str=(pack("h*", "fffe")); 

echo $str,"=",strlen($str),"位元組\n"; 

getascill($str); 

//c字元 

$str=(pack("c*", "55","56","57")); 

echo $str,"=",strlen($str),"位元組\n"; 

getascill($str); 

//i字元 短整形 32位 4個位元組 64位8個位元組 

$str=(pack("i", "100")); 

echo $str,"=",strlen($str),"位元組\n"; 

getascill($str); 

//s字元 短整形 2個位元組 

$str=(pack("s", "100")); 

echo $str,"=",strlen($str),"位元組\n"; 

getascill($str); 

//l字元 長整形 4個位元組 

$str=(pack("l", "100")); 

echo $str,"=",strlen($str),"位元組\n"; 

getascill($str); 

//f字元 單精度浮點 4個位元組 

$str=(pack("f", "100")); 

echo $str,"=",strlen($str),"位元組\n"; 

getascill($str); 

//d字元 雙精度浮點 8個位元組 

$str=(pack("d", "100")); 

echo $str,"=",strlen($str),"位元組\n"; 

getascill($str); 

function getascill($str) 

echo "**********===\r\n\r\n"; 

} ?>

通過上面例項,我們可以看到,相同字串,用不同格式儲存,所占用的位元組數不同。 這裡也可以看到,以不同格式儲存字元可以達儲存節省空間。而且啟到不可讀加密效果。 突然想到一點,設計資料庫字段型別問題,如果乙個字段只是:10位長度整型。我們設定為整形:256*256*256*256 就4個位元組,如果設定為10個長度字串。那就佔10個位元組。整個消化空間就是2倍的。 設定正確字元型別對提高資料庫效能有很多幫助。呵呵,有點跑題了……

php處理位元組碼通訊例項分析

剛剛說的pack作用:節省空間、加密格式 

下面就這2個做乙個例項說明,介面開發要求: 

引數描述

使用者名稱20位元組,字元型

密碼10位元組,字元型

年齡1位元組,無符char型

出生年月

4位元組,整型(19800101)

郵箱50位元組,字串

各字段間用:"\0"分割

a、pack封包

[php]view plain

copy

print

?$code=array(   

"username"=>array("a20","張三adfb12"),   

"pass"=>array("a10","asdf*#1"),   

"age"=>array("c","23"),   

"birthday"=>array("i","19900101"),   

"email"=>array("a50","[email protected]"));   

$stream=join("\0",packbyarr($code));   

echo $stream,strlen($stream);   

file_put_contents("c:/1.txt",$stream);    //將流儲存起來便於下面讀取   

function packbyarr($arr)     

return $atarr;   

}   

function getascill($str)    

}   

因為用」\0」分割,整個長度是89位元組。通過上面輸出,有一些字串輸出是可以讀取的,其它都已經變成亂碼了。這也是我說可以保密效果原因。 

b、unpack解包 

解包需要按照,打包方式讀取,該讀取多長,該用什麼型別讀取,必須與打包規定一樣。

[php]view plain

copy

print

?$code=array(   

"username"=>array("a20"),   

"pass"=>array("a10"),   

"age"=>array("c"),   

"birthday"=>array("i"),   

"email"=>array("a50"));   

$stream=file_get_contents("c:/1.txt");   

var_dump(packbyarr($stream,$code));   

function packbyarr($str,$code)    

return $atarr;   

}   

操作二進位制寫入二進

操作二進位制 寫入二進位制 1 宣告變數 sqlite3 stmt stat 2 把sql語句解析到stat結構中去 sqlite3 prepare 3 繫結替換 sqlite3 bind blob 4 儲存到資料庫 int result sqlite3 step 5 釋放stat結構 sqlite...

mysql儲存二進位制 mysql 儲存二進位制資料

晚上小研究了下mysql儲存於讀取二進位制資料的功能。關鍵步驟為以下三點 最重要的一點 儲存二進位制資料的表的型別需要是blob型別 按長度不同分為tiny,media,long 插入二進位制資料時需要利用mysql real escape string函式對資料進行轉換 從資料庫中讀取二進位制資料...

mysql 二進位製流 用mysql儲存二進位制資料流

用mysql儲存二進位制資料流,閱讀用mysql儲存二進位制資料流,近日一專案遇到需要在db中儲存2進製資料流型別檔案的問題,發現常用的mysql api都用不了,再研究,方知有一套專門的api來幹這種資料,功能相當強大的說。以下即為範例 按照說明編譯即可用,稍加修改即可儲存2進製檔案 mysql資...