PHP的pack方法總結備忘

2021-06-03 13:43:36 字數 3504 閱讀 6331

前面在研究websocket的時候用到了pack跟unpack方法,這兩個方法一直讓我感覺起來比較深奧,當時從網上找了很多資料來研究,現在把這兩個函式的使用方法以及引數介紹記下來,以作備忘

先看pack方法的說明:

pack -- 將資料打包成二進位制字串

語法:string pack(string format, mixed [args]...);

引數一:format引數表示以什麼格式格式化資料

引數二:將被格式化的資料

引數一的可選值:

anul-padded string

null填充字串空白格式,返回1位,預設讀取10進製資料

aspace-padded string

space填充字串空白格式,返回1位,預設讀取10進製資料

hhex string, low nibble first

十六進製制格式,每次格4位,低四位在前,預設讀取10進製資料

hhex string, high nibble first

十六進製制格式,每次格4位,高四位在前,預設讀取10進製資料

csigned char

有符號字元格式,每次格8位,預設讀取16進製制資料

cunsigned char

無符號字元格式,每次格8位,預設讀取16進製制資料

ssigned short (always 16 bit, machine byte order)

有符號短整型格式(每次格16位,以計算機位元組順序),預設讀取16進製制資料

sunsigned short (always 16 bit, machine byte order)

無符號短整型格式(每次格16位,以計算機位元組順序),預設讀取16進製制資料

nunsigned short (always 16 bit, big endian byte order)

無符號短整型(每次格16位,以低端位址存放高位資料順序),預設讀取16進製制資料

vunsigned short (always 16 bit, little endian byte order)

無符號短整型(每次格16位,以低端位址存放低位資料順序),預設讀取16進製制資料

isigned integer (machine dependent size and byte order)

有符號整形(每次格機器最大定址位數的資料,以計算機位元組順序),預設讀取16進製制資料

iunsigned integer (machine dependent size and byte order)

無符號整形(每次格機器最大定址位數的資料,以計算機位元組順序),預設讀取16進製制資料

lsigned long (always 32 bit, machine byte order)

有符號長整型格式(每次格32位,以計算機位元組順序),預設讀取16進製制資料

lunsigned long (always 32 bit, machine byte order)

無符號長整型格式(每次格32位,以計算機位元組順序),預設讀取16進製制資料

nunsigned long (always 32 bit, big endian byte order)

無符號長整型格式(每次格32位,以低端位址存放高位資料順序),預設讀取16進製制資料

vunsigned long (always 32 bit, little endian byte order)

無符號長整型格式(每次格32位,以低端位址存放低位資料順序),預設讀取16進製制資料

ffloat (machine dependent size and representation)

單精度實型格式(取決於機器的最大定址位數和表示)

ddouble (machine dependent size and representation)

雙精度實型格式(取決於機器的最大定址位數和表示)

xnul byte

xback up one byte

@nul-fill to absolute position

下面以具體的例子來講解一下每個引數的用法:

echo pack("a", 0x41);  //輸出6

將乙個十六進製制資料0x41以十進位制的方式讀取,0x41轉換成十進位制是65,取一位返回就是6

echo pack("a2", 0x41);  //輸出65

此**為取兩位返回為65

echo pack("h2", 0x41);  //輸出e

將乙個十六進製制資料0x41以十進位制的方式讀取,由於h是每次格4位,這裡用了h2,代**8位,由於高位在前,0x41轉換成十進位制是65,65被h2格式化之後是0x65,轉換成asc碼是e

echo pack("c", 0x41);  //輸出a

0x41是十六進製制的資料,所以經過c格式化之後是0x41,轉換成asc碼是a

echo pack("c", 65);  //輸出a

將十進位制資料65以十六進製制的方式讀取,65轉換成十六進製制是0x41,然後經過c格式化,轉換成asc碼是a

echo pack("s", 0x4143424445);   //輸出ed

十六進製制資料0x4143424445,經過s格式化,由於是按計算機位元組的循序,所以從低位資料開始,格式化16位,返回0x45,0x44,轉換成asc碼是ed

關於低位位址存放高位資料

資料:0x4143424445

位置:高位   <--   低位

資料:41   43   42   44   45

echo pack("n", 0x4143424445);  //輸出de

將0x4143424445以十六進製制方式讀取,然後經過n格式化,由於是按照以低端位址存放高位資料順序方式,格16位資料,返回0x44,0x45, 轉換成asc碼是de

echo pack("v", 0x4143424445);  //輸出ed

將0x4143424445以十六進製制方式讀取,然後經過v格式化,由於是按照以低端位址存放低位資料順序方式,格16位資料,返回0x45,0x44, 轉換成asc碼是ed

echo pack("i", 0x4143424445);  //輸出edbc

將0x4143424445以十六進製制方式讀取,然後經過i格式化,由於xp系統的最大定址位數是32位,所以格32位資料並以計算機位元組順序,返回0x45,0x44,0x42,0x43,轉換成asc碼是edbc

echo pack("l", 0x4143424445);  //輸出edbc

過程同s,這裡是格式化32位資料位元組,所以返回edbc

echo pack("n", 0x4143424445);  //輸出cbde

過程同n,這裡同樣格式化32位資料位元組,返回cbde

對於pack,如果提供的資料不是format預設讀取的資料進製,則會先轉換為相應的資料進製,再進行打包操作

unpack(

string

$format

, string

$data

) 將獲取到的二進位制資料流解包,format引數同pack()

小試Python中的pack 方法

檔名稱 a.py 作 者 孔雲 問題描述 用pack 方法不參加排列標籤 問題分析 如下 from tkinter import root tk lbred label root,text 紅色溝槽狀邊緣 fg red font 微軟雅黑 15 width 20,height 2,relief gr...

PHP魔術方法總結

php中的魔術方法都是以 開頭的,具有特殊作用的一些方法,可以看做php的語法糖。construct 構造器是乙個魔術方法,當物件被例項化時它會被呼叫。在乙個類宣告時它常常是第一件做的事但是沒得必要他也像其他任何方法在類中任何地方都可以宣告,構造器也能像其他方法樣繼承。如 構造方法示例,可以繼承重寫...

php查詢類的方法總結

本教程操作環境 windows7系統 php7.1版 dell g3電腦 在php中,gbtcpz可以使用get class methods 函式來查詢類裡面有哪些方法。get class methods 函式可以獲取類的所有方法,返回由類的方法名組成的陣列。語法 get class methods...