这是使用的'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·€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
答案 0 :(得分:0)
在PHP的pack
和unpack
中,格式代码a
代表NUL 填充字符串。在这种情况下,看起来第二个和第七个字段不是NUL填充的;他们只有NUL来指示字符串结束的位置,然后是随机数据。
要在NUL之前获取字符串的一部分,您可以使用substr
和strpos
:
$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"
答案 1 :(得分:0)
是的,因为你解压缩的第二个参数是“a128ac”和手册(http://jp2.php.net/manual/en/function.pack.php)说“a”代表“NUL-padded string”但是你可能想要“A”这是“SPACE-padded string”。你看到的是垃圾,因为找不到终结器。