首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PHP读取二进制文件

用PHP读取二进制文件
EN

Stack Overflow用户
提问于 2012-06-08 05:56:35
回答 2查看 607关注 0票数 4

这是使用的'C++‘结构。

代码语言:javascript
复制
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.01/01/1998 a 52.23 54.12 10.12费用92 16.12 31/12/1999 a 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/01/2000A 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 52.23 54.12 10.12费用92 16.12 /12/2010 d us 12.23 34.12 90.12费用12 56.12

PHP编码读取上述二进制文件的内容。

代码语言:javascript
复制
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·g·ew·ew·dw·àew·

·w·r·w·;w·1·{·<ây·Ð{SpP·ip·dw·ew·ew·ew·5w·Og·X= 12.229999542236 34.119998931885 90.120002746582费用·5RP·#rP·ô>Å#rP·ô>Å#rP·ô>Å12 56.119998931885

1998年1月1日a M·g·ew·dw·àew·w·r·w·;w··<ây·Ðr·ip·dw·ew·ew·ew·Og·X= 52.229999542236 54.119998931885 10.119999885559费用·5RP·#Sg·rP·ô>Å#rP·ô>Å#rP·ô>Å92 16.120000839233

31/12/1999 a M·g·ew·dw·àew·w·r·w·;w··<ây·Ðip·{·<ây·Ð·{SpP·ip·dw·ew·ew·ew·5w·Og·X= 52.229999542236 54.119998931885 10.119999885559规费·5RP·#Sg·rP·ô>Å#rP·ô>Å#rP·ô>Å92 16.120000839233

31/ 12 /1999 d、M·g·ew·dw·àew·w·úr·w·;w··<ây·Ðip·{·<ây·Ð·{SpP·ip·dw·ew·ew·ew·ew·5w·Og·X= 12.229999542236 34.119998931885 90.120002746582费用·5RP·#Sg·rP·ô>Å#rP·ô>Å#rP·ô>Å12 56.119998931885

01/2000 a M·g·ew·dw·àew·w·r·w·;w··<ây·Ð@p·ip·dw·ew·ew·5w·x= 52.229999542236 54.119998931885 10.119999885559规费·5RP·#rP·ô>Å#rP·ô>Å#rP·ô>Å92 16.120000839233

01/01/2000 z、M·g·ew·dw·àew·w·úr·w·;w··<ây·Ðip·{·<ây·Ð·{SpP·ip·dw·ew·ew·ew·5w·Og·X?qP·Sg us 12.229999542236 34.119998931885 90.120002746582费用·5RP·#Sg·rP·ô>Å#rP·ô>Å12 56.119998931885

31/12/2010 a M·g·ew·dw·àew·w·úr·w·;w··<ây·Ða{{·<ây·Ð·{SpP·ip·dw·ew·ew·ew·5w·Og·X= 52.229999542236 54.119998931885 10.119999885559费用·5RP·#Sg·rP·ô>Å#rP·ô>Å#rP·ô>Å92 16.120000839233

31/ 12 /2010 d,m·g·ew·dw·àew·w·r·w·;w·€1(·<ây·Ð{·<ây·Ð·{SpP·ip·dw·ew·ew·ew·5w·Og·X=1)qP·Sg us 12.229999542236 34.119998931885 90.120002746582规费·5RP·#Sg·rP·ô>Å#rP·ô>Å12 56.119998931885

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-08 08:10:01

在PHP的packunpack中,格式化代码a代表NUL填充字符串。在本例中,第二个和第七个字段似乎不是NUL填充的;它们只有NUL来指示字符串的结尾位置,后面是随机数据。

要在NUL之前获取字符串的部分,可以使用substrstrpos

代码语言:javascript
复制
$input = "a\000b"; // string with embedded NUL 
$output = substr($input, 0, strpos($input, "\000"));
var_dump($output); // string(1) "a"

浮动字段有正确的值,您在C程序输出中看到的值是四舍五入的。要在PHP中执行同样的操作,可以使用sprintf,例如:

代码语言:javascript
复制
$input = 16.120000839233;
$output = sprintf("%.2f", $input);
var_dump($output); // string(5) "16.12"
票数 0
EN

Stack Overflow用户

发布于 2012-06-08 08:10:32

是的,因为解包的第二个参数是"a128ac“,手动(http://jp2.php.net/manual/en/function.pack.php)表示"a”表示“NUL-填充字符串”,但您可能需要"A“,即”空格填充字符串“。您看到的是垃圾,因为没有正确找到结束符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10943730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档