將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...