php使用pack處理二進位檔案的方法_php技巧

來源:互聯網
上載者:User

php讀寫二進位檔案可以使用pack和unpack函數。
今天要處理一個二進位檔案的問題,所以需要用一下,特意瞭解一下pack的用法,unpack用法與此類似。

簡單來說,pack函數就是給一個目標格式,和相應的參數,就可以返回位元據了。

下面舉例加以說明,對於四個整數:

pack("L4", 0,1,2,3)pack("LLLL", 0,1,2,3)pack("L", 0).pack("L", 1).pack("L", 2).pack("L", 3)

上面的處理結果是一樣的,也就是說,format是描述後面的資料的格式。
至於具體format可以用什麼,看看format characters就知道了。
比如一個30字元的 pack("a30", "http://www.jb51.net") ,就是這個意思,很簡單

pack函數的官方聲明如下:

引用pack(PHP 3, PHP 4, PHP 5)pack -- Pack data into binary stringDescriptionstring pack ( string format [, mixed args [, mixed ...]] )Pack given arguments into binary string according to format. Returns binary string containing data. The idea to this function was taken from Perl and all formatting codes work the same as there, however, there are some formatting codes that are missing such as Perl's "u" format code. The format string consists of format codes followed by an optional repeater argument. The repeater argument can be either an integer value or * for repeating to the end of the input data. For a, A, h, H the repeat count specifies how many characters of one data argument are taken, for @ it is the absolute position where to put the next data, for everything else the repeat count specifies how many data arguments are consumed and packed into the resulting binary string. Currently implemented are表格 1. pack() format charactersCode Description a NUL-padded string A SPACE-padded string h Hex string, low nibble first H Hex string, high nibble first c signed char C unsigned char s signed short (always 16 bit, machine byte order) S unsigned short (always 16 bit, machine byte order) n unsigned short (always 16 bit, big endian byte order) v unsigned short (always 16 bit, little endian byte order) i signed integer (machine dependent size and byte order) I unsigned integer (machine dependent size and byte order) l signed long (always 32 bit, machine byte order) L unsigned long (always 32 bit, machine byte order) N unsigned long (always 32 bit, big endian byte order) V unsigned long (always 32 bit, little endian byte order) f float (machine dependent size and representation) d double (machine dependent size and representation) x NUL byte X Back up one byte @ NUL-fill to absolute position

看累了英文,下面來看看對應的中文解釋:

引用pack()函數的作用是:將資料壓縮成一個二進位字串。a - NUL-padded string a - NUL- 字串填滿[padded string] A - SPACE-padded string A - SPACE- 字串填滿[padded string] h - Hex string, low nibble first h – 十六進位字串,低“四位元”[low nibble first] H - Hex string, high nibble first H - 十六進位字串,高“四位元”[high nibble first] c - signed char c – 帶有符號的字元 C - unsigned char C – 不帶有符號的字元 s - signed short (always 16 bit, machine byte order) s – 帶有符號的短模式[short](通常是16位,按機器位元組順序) S - unsigned short (always 16 bit, machine byte order) S – 不帶有符號的短模式[short](通常是16位,按機器位元組排序) n - unsigned short (always 16 bit, big endian byte order) n -不帶有符號的短模式[short](通常是16位,按大endian位元組排序) v - unsigned short (always 16 bit, little endian byte order) v -不帶有符號的短模式[short](通常是16位,按小endian位元組排序) i - signed integer (machine dependent size and byte order) i – 帶有符號的整數(由大小和位元組順序決定) I - unsigned integer (machine dependent size and byte order) I – 不帶有符號的整數(由大小和位元組順序決定) l - signed long (always 32 bit, machine byte order) l– 帶有符號的長模式[long](通常是32位,按機器位元組順序) L - unsigned long (always 32 bit, machine byte order) L – 不帶有符號的長模式[long](通常是32位,按機器位元組順序) N - unsigned long (always 32 bit, big endian byte order) N – 不帶有符號的長模式[long](通常是32位,按大edian位元組順序) V - unsigned long (always 32 bit, little endian byte order) V– 不帶有符號的長模式[long](通常是32位,按小edian位元組順序) f - float (machine dependent size and representation) f –浮點(由大小和位元組順序決定) d - double (machine dependent size and representation) d – 雙精確度(由大小和位元組順序決定) x - NUL byte x – 空位元組[NUL byte] X - Back up one byte X- 後面一個位元組[Back up one byte] @ - NUL-fill to absolute position @ - NUL- 添加到一個絕對位置[absolute position]

範例程式碼如下:

<?php $code=array("username"=>array("A7","張三adfb12"),"pass"=>array("A10","asdf*#1"),"age"=>array("C","23"),"birthday"=>array("I","19900101"),"email"=>array("A50","www.jb51.net"));$stream=join("\0",parkByArr($code));echo $stream,strlen($stream);file_put_contents("1.txt",$stream);//將流儲存起來便於下面讀取function parkByArr($arr){ $atArr=array(); foreach ($arr as $k=>$v) { $atArr[]=pack($v[0],$v[1]); } return $atArr;}function getAscill($str){ $arr=str_split($str); foreach ($arr as $v) { echo $v,"=",ord($v),"\n"; }}$code=array("username"=>array("A20"),"pass"=>array("A10"),"age"=>array("C"),"birthday"=>array("I"),"email"=>array("A50"));$stream=file_get_contents("1.txt");var_dump(parkByArr($stream,$code));function parkByArr($str,$code){ $Arr=explode("\0",$str); $atArr=array(); $i=0; foreach ($code as $k=>$v) { $atArr[$k]=unpack($v[0],$Arr[$i]); $i++; } return $atArr;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.