1. 程式人生 > >PHP中二進位制的編碼包pack與解包unpack

PHP中二進位制的編碼包pack與解包unpack

1. 為什麼使用pack

我們知道,在網路傳輸過程中,我們的資料都是以二級制的網路報文在進行傳輸,很多時候,我們多語言之間互動的時候,想在傳輸的過程中約定傳輸的頭資訊,比如常見的http協議 是展示的明文傳輸的 

GET /game HTTP/1.1
Host: sp0.baidu.com
Connection: keep-alive

但很多時候,比如我們要做的是遊戲的排行榜,而遊戲的分數來自C++,每次遊戲結束我們要重新整理排行榜,可能我們之間並沒有完整的 session會話來確保我們的通訊是可靠的,這時,如果我們互相之間約定一個傳輸協議,比如請求頭中那幾位是驗證資訊,哪幾位使我們要傳輸的資料,如果驗證不通過,我們就認為是非法來源,直接返回403等狀態碼,場景大概是這樣。進入pack的主題,怎麼用。

2. 使用pack和unpack

string pack ( string $format [, mixed $args [, mixed $... ]] )

pack中有多個引數,其中

$format  為格式引數有點類似於c中的print 設定的%s  但是去掉了% 而且更靈活,

               字母數字  或者 字母   或者 字母*

                a12 或者 或者 H*

$args  的個數取決於格式中字母的個數  比如 'a12a13'  就需要兩個字串 分別是12位 和 13 位 位數不足以nul填充

           如果是單個字母不跟數字 則為一位型別的字元

           如果是單個字母跟上 *  則為該型別任意長度的字元 

編碼 描述
a 以NUL位元組填充字串空白
A 以SPACE(空格)填充字串
b 一個位串 每個位元組裡位的順序都是升序
B 一個位串 每個位元組裡位的順序都是降序
h 十六進位制字串,低4位在前 一位對應二進位制的四位
H 十六進位制字串,高4位在前
c 一個有符號字元 char (8位整數)值
C 一個無符號字元 char (8位整數)值 關於Unicode參閱 U
s 有符號短整型(16位,主機位元組序)
S 無符號短整型(16位,主機位元組序)
n 一個16位無符號短整型(16位,大端位元組序) “網路位元組序”
v 無符號短整型(16位,小端位元組序)
i 有符號整型(機器相關大小位元組序)
I 無符號整型(機器相關大小位元組序)
l 有符號長整型(32位,主機位元組序)
L 無符號長整型(32位,主機位元組序)
N 一個16位無符號長整型(32位,大端位元組序) “網路位元組序”
V 無符號長整型(32位,小端位元組序)
q 有符號長長整型(64位,主機位元組序)
Q 無符號長長整型(64位,主機位元組序)
J 無符號長長整型(64位,大端位元組序)
P 無符號長長整型(64位,小端位元組序) 一個指向空結尾字串的指標
p 一個執行定長字串的指標
u 一個無編碼的字串
U 一個Unicode字元數字
f 單精度浮點型(機器相關大小)
d 雙精度浮點型(機器相關大小)
x NUL位元組
X 回退一位元組
Z 以NUL位元組填充字串空白(new in PHP 5.5)
@ NUL填充到絕對位置

同樣的解碼函式 unpack

array unpack ( string $format , string $data [, int $offset = 0 ] )

第一個也是格式串,單個字母或者多個字母型別的必須使用 (多個字母 \ 不能省略)

              格式名稱格式名稱  組成索引陣列(好像是從1開始)    或者

              格式名稱欄位名稱 格式名稱欄位名稱  組成鍵值陣列

廢話不多說 看兩個例子

$username = '[email protected]';
$password = 'b123456';
$packdata   = pack('SCSa32a32',0x0040,0x00,0x0006, $username, $password );
$unpackdata = unpack('Shead/Cflag/Sflag2/a32word/a32passd/',$packdata);

print_r($unpackdata);

$username = '[email protected]';
$packdata   = pack('a32',$username);
$unpackdata = unpack('a*',$packdata);
print_r($unpackdata) ;

相關推薦

PHP二進位制編碼packunpack

1. 為什麼使用pack 我們知道,在網路傳輸過程中,我們的資料都是以二級制的網路報文在進行傳輸,很多時候,我們多語言之間互動的時候,想在傳輸的過程中約定傳輸的頭資訊,比如常見的http協議 是展示的明文傳輸的  GET /game HTTP/1.1 Host: sp0.

python的組

關於【組包與解包】: 組包:python直譯器自動將多個數據組裝到一個容器中 解包:將容器中的多個數據拆出來組包: 直譯器把1,2,3自動組包成一個元組,然後賦值給a,a的型別就是元組型別的   a = 1,2,3 # 相當於 a = (1,2,3)   print(a) #

OSI互聯數據封裝封裝

數據包 封裝 解封裝當我們在七層協議最上層,主機A想和其它主機通信, 比如telnet到主機B,各層都為數據打包後再封裝上自己能識別的數據標簽,現在我們只說四層以下的通信過程。 1、當一個高層的數據包到達傳輸層,由於telnet使用TCP協議,傳輸層將上層傳過來的數據不變再封裝TCP的包頭以便目標主

php對象類型數組之間的轉換

from ech php json simple imp 對象 rom AD 1.剛看視頻學習的時候看到一個困擾很久的問題, 有時候我們在進行做項目的時候會碰到的一個小問題。舉一個小例子。 獲取一個xml文件裏面的數據。 xml.xml文件如下:

php的func_num_args、func_get_argfunc_get_args函數

返回函數 函數定義 lse https sheng use second hive bar https://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/21/2183157.html php的的func_num_ar

phpecho(),print(),print_r(),var_dump()var_export()間的區別

echo()函式:輸出一個或多個字串。 輸出所有引數。不會換行。 echo 不是一個函式(它是一個語言結構), 因此你不一定要使用小括號來指明引數,單引號,雙引號都可以。 echo (不像其他語言構造)不表現得像一個函式, 所以不能總是使用一個函式的上下文。 另外,如果

jar壓縮壓詳

1、解壓jar包: 命令:C:\jar>jar xf lm.jar 沒有任何錯誤提示,表示解壓成功。 2、壓縮jar包: 命令:C:\jar>jar cvf lm.jar 檔案1 檔案2 檔案3 檔案4 回車,壓縮後的jar包就在本目錄下,也可以這樣 命令:jar cvf lm.

php的Trait特性技術詳

/** * trait 程式碼複用機制 * 1.trait本意是特徵,就是給當前類新增一些新特徵; * 2.而這些新功能,尚不具備形成一個功能完善的類,並且也不方便用一個類進行包裝 * 3.類似於類的外掛庫,用來擴充當前類的功能,或者在不修改父類功能的前提下,實現功能動態更新 * 4.它工

php如何執行linux命令詳

前言 本文主要給大家介紹了關於在php中如何執行linux命令的相關內容,下面話不多說了,來一起看看詳細的介紹吧 php如何執行某個命令 ,官方手冊在這裡 我們先從shell_exec來說 如何使用shell_exec在php裡面執行shell命令 先來試一下,使用php執行某個

javaScript函式的自執行的格式及作用

(function(){ console.log('小黃人'); })();   (function(){   console.log('小綠人'); }());   自執行作用:   1.做程式碼的封裝   2.用來控制變數的作用域 閉包:在函式內部,return一

關於PHP的定時任務crontab詳

最近遇到很多關於定時任務的,說實話PHP指令碼本身也有一個兩個函式可以結合做成定時任務,但是效果很一般,首先選擇的還是系統計任務計劃好一些,不管是win還是Linux系統都具備任務計劃功能,而我們要做的就是用好這些功能,下面是Linux中的定時任務詳解,由於太長,直接找到拷

PHPeval函式的危害正確禁用方法

php的eval函式並不是系統元件函式,因此我們在php.ini中使用disable_funct

.NET二進位制圖片的儲存讀取

.NET二進位制圖片儲存與讀取的常見方法有以下幾種: .NET二進位制圖片儲存:以二進位制的形式儲存圖片時,要把資料庫中的欄位設定為Image資料型別(SQL Server),儲存的資料是Byte[]. 1.引數是圖片路徑:返回Byte[]型別:  publicbyte[

php字串編碼格式處理

1.mb_detect_encoding — 檢測字元的編碼; 2.iconv()–將一種已知的字符集檔案轉換成另一種已知的字符集檔案; 3.mb_convert_encoding()–轉換字元的編

linux下zip命令打包

-a 將檔案轉成ASCII模式 -F嘗試修復損壞的壓縮檔案 -h顯示幫助介面 -m將檔案壓縮之後,刪除原始檔 -n特定字串 不壓縮具有特定字尾字串的檔案 -o將壓縮檔案內的所有檔案的最新變動時間設為壓縮時候的時間 -q安靜模式,在壓縮的時候不顯示指令的執行過程 -r將指定的目錄下的所有子目錄以及檔案一起處理

androidimage檔案的壓縮壓縮

我們將android原始碼進行編譯之後,會在out/target/product/<product-name>/目錄下生成幾個image檔案:system.img,recovery.img,userdata.img等,將這些image檔案連同一些bin檔案燒寫到

PHP註解(Annotation)的定義使用

註解的定義:略 近期,框架中使用了註解來實現許可權的控制 1.註解的使用 /** * 列表及搜尋 * @funcName 院所管理-院所列表 */ public function index() {

php使用while、eachlist函式組合遍歷二維陣列的方法

        在php中,系統為程式設計師提供了包括for迴圈、foreach()語句以及while、each與list函式組合遍歷陣列的三種方法。其中,由於for迴圈只能對索引值是連續的索引陣列進行遍歷而不能成為遍歷陣列的首選方法。而while、each與list函式組

Javascript的作用域鏈

Javascript中有兩個十分重要的概念–作用域鏈和閉包。 我是這樣理解作用域鏈的,在一個函式中,函式內部所有可以訪問的變數,排成了一個棧,想根據某個變數名訪問變數時,就從棧頂開始向下搜尋,搜到的第一個就算是找到了。那麼,這個棧是怎麼排列的呢?棧頂,是函式的內部變數

python 引數傳遞[打包問題]

1. 傳遞引數時,可以傳遞基於引數名的字典f(**param_dict) 也可以傳遞基於位置的列表f(*param_list) 2.獲取引數列表 對於函式,可以直接在開頭param_dict=locals()獲取引數字典 對於方法(類、例項),獲取的引