2012-06-08 195 views
4

這是使用的「C++」結構。使用PHP讀取二進制文件

struct gross 
    { 
     char date[11]; 
     char ac[128]; 
     char type[5]; 
     float mvalue; 
     float netraw; 
     float netfer; 
     char stat[128]; 
     float firr; 
     float acb; 
    }; 

這是使用GCC編譯器編譯時生成的二進制文件的內容。

1995年12月12日ð我們12.23 34.12 90.12費12 56.12 01/01/1998一個我們52.23 54.12 10.12費92 16.12 31/12/1999一個我們52.23 54.12 10.12費92 16.12 31/12/1999 d us 12.23 34.12 90.12費用12 56.12 01/01/2000 a us 52.23 54.12 10.12費用92 16.12 01/01/2000 z us 12.23 34.12 90.12費用12 56.12 31/12/2010 a us 52.23 54.12 10.12費用92 16.12 31/12/2010 d us 12.23 34.12 90.12費用12 56.12

PHP編碼讀取cont上面的二進制文件的入口。

echo "<table>"; 
while (!feof($f)) { 

    if ($s = fread($f, 292)) { 

     $nn = unpack('a11date/a128ac/a5type/fmvalue/fnetraw/fnetfer/a128stat/ffirr/facb', $s); 

     echo "<td>" . $nn[date] ."</td>"; 
     echo "<td>" . $nn[ac] . "</td>"; 
     echo "<td>" . $nn[type] . "</td>"; 
     echo "<td>" . $nn[mvalue] . "</td>"; 
     echo "<td>" . $nn[netraw] . "</td>"; 
     echo "<td>" . $nn[netfer] . "</td>"; 
     echo "<td>" . $nn[stat] . "</td>"; 
     echo "<td>" . $nn[firr] . "</td>"; 
     echo "<td>" . $nn[acb] . "</td>"; 
     echo "</tr>"; 
} 
} 
     echo "</table>"; 
fclose($f); 
?> 

這就是我從上面的代碼得到的。我所得到的是第二和第七領域中的大量垃圾值。精度超過浮點數字段。如何解決這個問題?

1995年12月12日d¸³M·克·EW·¤dw·AEW·我們·YYYY,瓦特·O;·W·Ìª¹¿ô{·{·

01/01/1998a¸³M·克·EW·¤dw·AEW·我們·YYYY,瓦特· Ø; W·Ìª¹¿ô{·{· A#Ä5RP·0#O·XW·X«¹¿·ÅÿÿýŽäSg·XW·ÆD¬¹¿L¬¹¿5rP·POY· 92 16.120000839233

31/12/1999 aa³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<·Ð{·SpP·ip ·¤dw·ew·€5w·ôOg· X«¿»qP·äSgus 52.229999542236 54.119998931885 10.119999885559費用·5rP·#·Sg·rP·ô#·5rP·0·o·xxw·x« ¹¿·ÅÿÿýŽäSg·XW·ÆD¬¹¿L¬¹¿5rP·POY·92 16.120000839233

31/12/1999d¸³M·克·EW·¤dw·AEW·我們·YYYY,瓦特· Ø; W·Ìª¹¿ô{·{· A#Ä5RP·0#O·XW·X«¹¿·ÅÿÿýŽäSg·XW·ÆD¬¹¿L¬¹¿5rP·POY·12 56.119998931885

01/01/2000 aa³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<·Ð{·SpP·ip·¤ dw·ew·€5w·ôOg· X«¿»qP·äSgus 52.229999542236 54.119998931885 10.119999885559費用·5rP·#sg·rP·Å#Ä5rP·0#o·¸xw·x«¹¿ ·ÅÿÿýŽäSg·¸xw·ÆD¬¹¿L¬¹¿5rP·pòy·92 16.120000839233

01/01/2000zó³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; ··········································fees fees 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12············· RP·O> A#Ä5RP·0#O·XW·X«¹¿·ÅÿÿýŽäSg·XW·ÆD¬¹¿L¬¹¿5rP·POY·12 56.119998931885

31/12/2010a¸³M·克·EW·¤dw·AEW·我們·YYYY,瓦特·O;·W·Ìª¹¿ô{·{·

31/12/2010d¸³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w ·Ìª¹¿ô{·{· A#Ä5RP·0#O·XW·X«¹¿·ÅÿÿýŽäSg·XW·ÆD¬¹¿L¬¹¿5rP·POY·12 56.119998931885

+1

它可能是你的編譯器輸出的是文件的方式和方法的PHP腳本之間的字符編碼的區別打開該文件。試着找出是什麼類型的編碼,以及是否可以在php中打開該文件,同時指定如何讀取它。 –

回答

0

在PHP的packunpack,格式化代碼a代表NUL 填充字符串。在這種情況下,看起來第二個和第七個字段不是NUL填充;他們只有NUL來指示字符串結束的位置,隨後是隨機數據。

爲了獲取字符串的一部分NUL,然後才能使用substrstrpos

$input = "a\000b"; // string with embedded NUL 
$output = substr($input, 0, strpos($input, "\000")); 
var_dump($output); // string(1) "a" 

浮領域有其正確的價值觀,價值觀,你的輸出從C程序中看到的是圓潤。做同樣的PHP可以使用sprintf例如:

$input = 16.120000839233; 
$output = sprintf("%.2f", $input); 
var_dump($output); // string(5) "16.12" 
0

是因爲你的解壓第二個參數是「a128ac」和手動(http://jp2.php.net/manual/en/function。 pack.php)表示「a」代表「NUL填充字符串」,但您可能需要「A」,即「SPACE填充字符串」。你看到的是垃圾,因爲找不到終結者。