在php中读取二进制文件记录

时间:2012-06-05 10:49:22

标签: php binaryfiles

我使用C编码创建了二进制文件。这是该二进制文件的结构。

struct emp
{
   int eid,eage;
   char name[20],city[20];
}record;

使用这个'C'结构我创建了一个名为“table1.txt”的二进制文件

现在我想使用php在网页中显示文件的内容。我怎么能这样做?

<html>
<head>
<title>binary file</title></head>
<body style="background-color:yellow">
<?
$fp = fopen("table1.txt", "rb");
$read = fread($fp, 4); 
$n = unpack("i", $read);
$data1 = fread($fp, 8);
$nn = unpack("i",$data1);
echo $number[1]; 
?>
</body>
</html>

我使用了上面的代码。但我只能读取文件的第一个字段。我的第一个Record字段是Employee id,其值为'0'。页面仅显示0.

2 个答案:

答案 0 :(得分:1)

由于某些奇怪的原因,每个数据段不是预期的48个字节,而是52个字节。

$f = fopen('data.txt', 'rb');

while (!feof($f)) {
  // read one segment of 52 bytes
  if ($s = fread($f, 52)) {
    // unpack the binary structure into an associative array
    print_r(unpack('ieid/ieage/a20name/a20city', $s));
  }
}

fclose($f);

答案 1 :(得分:1)

这是'C'结构。     结构总     {         char date [11];         char ac [128];         char类型[5];         浮动mvalue;         浮网;         浮动网;         char stat [128];         漂浮;         漂浮的;     };

这是使用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·€5瓦特·OOG·   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·€5瓦特·OOG·   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

     

31/12 /1999a¸³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw ·EW·€5瓦特·OOG·   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·€5瓦特·OOG·   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·€5瓦特·OOG·   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·€5瓦特·OOG·   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

     

31/12 /2010a¸³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw ·EW·€5瓦特·OOG·   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

     

31/12 /2010d¸³M·g·ew·¤dw·àew·Öúr·ÿÿÿÿ,w·ø; w·Ìª¹¿ô{·{·<â€Ð{·SpP·ip·¤dw ·EW·€5瓦特·OOG·   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