php讀取二進位制 php讀取二進位製流

2021-10-22 21:28:04 字數 4126 閱讀 8044

將php資料轉換為二進位制資料

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

將二進位制資料轉換為php資料

array unpack ( string $format, string $data )

$format:

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]

z 乙個空結束的(和空填充的)位元組串

@ – nul-fill to absolute position

@ – nul- 新增到乙個絕對位置[absolute position] //實際使用的時候作為從開頭跳到某位元組用,很有用

字串中會出現「\0」,此為c語言的字串結束符,需要手工將其刪掉:

$name = strtok($name, "\0");

例子1:

//從客戶端獲取二進位製流資料按字段長度進行解析

$stream = file_get_contents ( "php://input" );

//用n表示短整型資料s,用n表示整形資料i

$format = "ncode/a64username/ncount";

$length = 2+64+4;

$getarr = bin2string($stream,$format,$length);

print_r( $getarr);

//二進位制流轉化成字串

function bin2string($str,$format,$length){

for($i = 0, $c = strlen($str); $i < $c; $i += $length) {

$arr = unpack("@$i/$format", $str);

foreach($arr as &$value) {

if(is_string($value)) {

$value = strtok($value, "\0");

return $arr;

//將資料轉化成二進位製流傳送給客戶端

$arr = array("username"=>array('a64',"abc"),

"count"=>array('n',123));

echo string2bin($arr);

//轉化成二進位製流

function string2bin($arr){

$atarr=array();

foreach ($arr as $k=>$v)

$atarr=pack($v[0],$v[1]);

$stream=join($atarr);

return $stream;

//讀取二進位制檔案進行解析

$fp = fopen($file,"rb");

$data = fread($fp,2);

$arr = unpack("n",$data);

print_r($arr);

例子2:

struct bianbian {

char name[10];

char pass[33];

int age;

unsigned char flag;

比如有個「kilobug.com」檔案,內容就是上面的n個bianbian結構體構成的。讀取的php**:

/* 下面根據struct確定$format,注意int型別跟機器環境有關,我的32位linux是4個長度 */

$format = 'a10name/a33pass/iage/cflag';

/* 確定乙個struct占用多少長度位元組,如果只是讀取單個結構體這是不需要的 */

$length = 10 + 33 + 4 + 1;

/* 也可以用fopen + fread + fclose,不過file_get_contents因為可以mmap,效率更高 */

$data = file_get_contents('kilobug.com', 'r');

for ($i = 0, $c = strlen($data); $i < $c; $i += $length) {

$bianbian = unpack("@$i/$format", $data);

/* reference傳遞是php 5才支援的,如果用php4,得用其他辦法 */

foreach ($bianbian as &$value) {

if (is_string($value)) {

$value = strtok($value, "\0");

print_r($bianbian);

/* 輸出為array,即類似:*/

array

[name] => 'kilobug'

[pass] => 'kilobug.com'

[age] => 100

[flag] => 0

c c讀取二進位制檔案

因專案需要讀取二進位制檔案,一開始用c 讀取,c 下用的是ifstream類,完整 如下 ifstream in b3dmpath.c str ios in ios binary in.seekg 0,ios end size t filesize in.tellg in.seekg ios beg...

Matlab讀取二進位制檔案

ps bin檔案是二進位制檔案,是檔案格式binary的縮寫。一 檔案的開啟與關閉 1 開啟檔案 在讀寫檔案之前,必須先用fopen函式開啟或建立檔案,並指定對該檔案進行的操作方式。fopen函式的呼叫格式為 fid fopen 檔名,開啟方式 說明 1 fid 用於儲存檔案控制代碼值,如果返回的控...

Python 二進位制檔案讀取

其實對於檔案單純的讀取還是非常好解決的。只要使用如下語句即可把檔案讀取出到變數temp中 如果對open函式的引數mode不熟悉,可以查閱 此處我們需要以二進位制方式讀取該檔案,因此mode rb with open filename,mode rb as file temp file.read f...