簡體   English   中英

用PHP讀取二進制文件

[英]Reading Binary File with PHP

這是使用的'C ++'結構。

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編譯器編譯時生成的二進制文件的內容。

12/12/1995 d us 12.23 34.12 90.12費用12 56.12 01/01/1998 a us 52.23 54.12 10.12費用92 16.12 31/12/1999 a us 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編碼讀取上述二進制文件的內容。

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);
?>

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

12/12/1995d³³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw·ew· €5w·ôOg·X«¹¿»qP·äSg我們12.229999542236 34.119998931885 90.120002746582費用·5rP·#ÄäSg·rP·ô>Å#Ä5rP·0#o·¸xw·x«¹¿·ÅÿÿýŽäSg·¸xw ·ÆD¬¹¿L¬¹¿5rP·pòy·12 56.119998931885

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

1999年12月31日a¸³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw·ew· €5w·ôOg·X«¹¿»qP·äSg我們52.229999542236 54.119998931885 10.119999885559費用·5rP·#ÄäSg·rP·ô>Å#Ä5rP·0#o·¸xw·x«¹¿·ÅÿÿýŽäSg·¸xw ·ÆD¬¹¿L¬¹¿5rP·pòy·92 16.120000839233

1999年12月31日d¸³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw·ew· €5w·ôOg·X«¹¿»qP·äSg我們12.229999542236 34.119998931885 90.120002746582費用·5rP·#ÄäSg·rP·ô>Å#Ä5rP·0#o·¸xw·x«¹¿·ÅÿÿýŽäSg·¸xw ·ÆD¬¹¿L¬¹¿5rP·pòy·12 56.119998931885

01/01 /2000a¸³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw·ew· €5w·ôOg·X«¹¿»qP·äSg我們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·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw·ew· €5w·ôOg·X«¹¿»qP·äSg我們12.229999542236 34.119998931885 90.120002746582費用·5rP·#ÄäSg·rP·ô>Å#Ä5rP·0#o·¸xw·x«¹¿·ÅÿÿýŽäSg·¸xw ·ÆD¬¹¿L¬¹¿5rP·pòy·12 56.119998931885

2010年3月31日a¸³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw·ew· €5w·ôOg·X«¹¿»qP·äSg我們52.229999542236 54.119998931885 10.119999885559費用·5rP·#ÄäSg·rP·ô>Å#Ä5rP·0#o·¸xw·x«¹¿·ÅÿÿýŽäSg·¸xw ·ÆD¬¹¿L¬¹¿5rP·pòy·92 16.120000839233

2010年3月31日d¸³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw·ew· €5w·ôOg·X«¹¿»qP·äSg我們12.229999542236 34.119998931885 90.120002746582費用·5rP·#ÄäSg·rP·ô>Å#Ä5rP·0#o·¸xw·x«¹¿·ÅÿÿýŽäSg·¸xw ·ÆD¬¹¿L¬¹¿5rP·pòy·12 56.119998931885

在PHP的pack unpack ,格式代碼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"

是的,因為你解壓縮的第二個參數是“a128ac”和手冊(http://jp2.php.net/manual/en/function.pack.php)說“a”代表“NUL-padded string”但你可能想要“A”是“SPACE-padded string”。 你看到的是垃圾,因為找不到終結器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM