2011-04-29 63 views
2

我有一個二進制文件,都是8位整數。我試圖使用php unpack()函數,但我不能得到任何參數爲1字節整數工作。我試圖將數據與一個虛擬字節結合起來,以便我可以使用'n'/'v'參數。我正在使用Windows機器來做到這一點。最終,我想要一個函數返回一個基於8位二進制整數字符串的整數數組。我已經試過代碼如下 -PHP - 讀取8位整數

$dat_handle = "intergers.dat"; 
$dat_file = fopen($dat_handle, "rb"); 
$dat_data = fread($dat_file, 1); 
$dummy = decbin(0); 
$combined = $dummy.$dat_data; 
$result = unpack("n", $combined); 
+0

'「n」'無符號短 - 16位。當然,讀取8位int將會失敗,如果你將它讀作16位int;)。嘗試'解壓縮(「c」,$合併);' – 2011-04-29 02:35:16

+1

@Frank他的想法實際上是健全的(假設無符號數據),他的執行是錯誤的。當他應該預先加入'chr(0)'時,他預先設置'0'。這就是說,這仍然是錯誤的做法! – 2011-04-29 03:01:03

+0

你是對的:decbin返回一個包含字符「0」的PHP字符串,這根本不是他想要的。 – 2011-04-29 03:09:14

回答

4

您要查找的是char數據類型。現在有兩個版本,簽名(小寫c)和無符號(大寫C)。只需使用適合您數據的那個。

<?php 
    $byte = unpack('c', $byte); 
?> 

此外,如果數據文件只是一堆字節而沒有其他東西,而且您知道它的長度,那麼您可以這樣做。 (如果長度是16連勝簽署字符)。

<?php 
    $bytes = unpack('c16', $byte); 
?> 

如果你不知道有多少字節會在文件中,但你知道有隻將是字節你可以使用星號代碼讀取,直到EOF。

<?php 
    $bytes = unpack('c*', $byte); 
?> 
1

以下應該做你想要什麼(ord):

$dat_handle = "intergers.dat"; 
$dat_file = fopen($dat_handle, "rb"); 
$dat_data = ord(fread($dat_file, 1)); 

你所要做的是檢索單字節的整數值。由於您一次只能讀取一個字節,因此您始終只有一個有效的ASCII字符。 ord返回該一個字符的二進制值。