首頁  >  文章  >  後端開發  >  php pack()函數詳解與範例

php pack()函數詳解與範例

WBOY
WBOY原創
2016-08-08 09:24:261449瀏覽

pack和unpack在一般的程式中還真的不容易見到,但是如果你用過很久以前的php生成excel就會知道了。他的excel的頭就是pack出來的
最近在嘗試與C互動的時候又用上了這玩意,所以不得不再看一次。其實就是C要求我一定要有包頭。 。 。其實純字串也不錯嘛。幹嘛非得搞個包頭呢?真糾結 .。
手冊上有pack與unpack的介紹,但都是英文的。 。 。
 

  任何一款擁有socket操作能力的語言都有一個專門用於組包的函數,php也不例外!    有機會用php進行一些二進位操作。 最近用php寫一個socket客戶端連接一個用C++語言開發的遊戲服務端。 伺服器端開發人員使用了二進位的形式來定義協定的格式。協定格式如下:   包頭(2bytes)+加密(1byte)+命令碼(2bytes)+幀內容
1.包頭的內容是記錄幀內容的長度;2.加密:0表示不加密,1表示加密;3. 命令碼為服務端命令識別符號;
    一開始不了解php原來有pack可以來組裝二進制包, 走了彎路,讓服務端開發人員用C語言幫忙開發了的幾個內存操作函數,按照協定規則傳回二進位包,然後我將這幾個方法編譯成一組擴充函數供php使用。
 
  

    話歸正題,而本文是介紹如何使用pack和unpack這兩種方法的方法。 php官方手冊舉例太少,不能很容易理解,特別是那些格式化參數的使用。
轉摘的參數中文說明:pack/unpack 的摸板字符字符含義a 一個填充空的字節串
A 一個填充空格的字節串b 一個位串,在每個字節裡位的順序都是升序B 一個位元串,在每個位元組裡位的順序都是降序
c 一個有符號char(8位元整數)值
C 一個無符號char(8位元整數)值;關於Unicode 參見U
d 本機格式的雙精確度浮點數
f 本機格式的單精準度浮點數
h 一個十六進位串,低四位在前
H 一個十六進位串,高四位在前
i 一個有符號整數值,本機格式
I 一個無符號整數值,本機格式
l 一個有符號長整形,總是32 位元
L 一個無符號長整形,總是32 位元
n 一個16位短整形,“網絡”字節序(大頭在前)
N 一個32 位元短整形,“網絡”字節序(大頭在前)
p 一個指向空結尾的字符串的指針
P 一個指向定長字串的指標
q 一個有符號四倍(64位元整數)值
Q 一個無符號四倍(64位元整數)值
s 一個有符號短整數值,總是16 位元
S 一個無符號短整數值,總是16 位元,
位元組序跟機器晶片有關

u 一個無編碼的字串
U 一個Unicode 字元數字
v 一個「VAX」位元組序(小頭在前)的16 位元短整數
V 一個「VAX」位元組序(小頭在前)的32 位元短整數w 一個BER 壓縮的整數x 一個空位元組(向前忽略一個位元組)
X 備份一個位元組
Z 一個空結束的(和空填滿的)位元組字串
@ 用空位元組填滿絕對位置
string pack ( string $format [, mixed $args [, mixed $...]] )
一些規則:
1.每個字母後面都可以跟著一個數字,表示count(計數),如果count 是一個* 表示剩下的所有東西。
2.如果你提供的參數比 $format 要求的少,pack 假設缺的都是空值。如果你提供的參數比 $format 要求的多,那麼多餘的參數被忽略。
下面還是用例子來說明用法會容易理解一點:



PHP程式碼

  1. 關於Pack:  
  2.   
  3. 下面的第一部分把數位值包裝成位元組:  
  4. , 65, 66, 67, 68);      # $out 等於"ABCD"  ", 65, 66, 67, 68); # 一樣的東西    
  5. 下面的對 Unicode 的循環字母做同樣的事情:  
  6. ", 0x24b6, 0x24b7, 0x24b8 , 0x24b9);    
  7. 下面的做類似的事情,增加了一些空:  
  8. , 65, 66, 67 , 68);      # 
  9. $out
  10.  等於 "AB
  11. $data = "010000020007";  
  12. unpack(1/Sint $data);    
  13. ## array
  14. ('int1'=>1, 'char1'=>' 2, 'char2'=>7);    最後本文開頭講到的協定使用$lastact
  15.    = pack(
  16. 'SCSa32a32'
  17. ,0x0040, 0x00, 0x0006, 
  18. $username
  19. $username
  20. $username   unpack('Sint1/Cchar1/Sint2/ Cchar2/',$lastmessage);  
  21. 學習資料:
  22. http://blog.csdn.net/jojobb3138688/archive/2007/05/07/1598609.aspx
  23. 我上面的內容來自:http://blog.sina.com.cn/s/blog_3eba8f1c0100nq9r.html,我現在已經順利的使用完了。黑黑還有的參考資料:http://bbs.phpchina.com/thread-104492-1-1.htmlhttp://hi.baidu.com/chinetman/item/f78a71d847e7d638e2108fda 以上就介紹了php pack()函數詳解與範例,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn