为什么不能将许多unpack语句压缩为一个unpack形式(“Lfffffff”,$ bytes)?

时间:2015-04-29 01:15:13

标签: php arrays file binaryfiles unpack

<?php
//it is unnecessary to get the data file.
    $handle = fopen('data', 'rb');
    fread($handle,"64");
//it is no use to parse the first 64 bytes here.
    $bytes= fread($handle,"4");
    print_r(unpack("L",$bytes));
    echo  "<br/>";
    $bytes= fread($handle,"4");
    print_r(unpack("f",$bytes));
    echo  "<br/>";
    $bytes= fread($handle,"4");
    print_r(unpack("f",$bytes));
    echo  "<br/>";
    $bytes= fread($handle,"4");
    print_r(unpack("f",$bytes));
    echo  "<br/>";
    $bytes= fread($handle,"4");
    print_r(unpack("f",$bytes));
    echo  "<br/>";
    $bytes= fread($handle,"4");
    print_r(unpack("f",$bytes));
    echo  "<br/>";
    $bytes= fread($handle,"4");
    print_r(unpack("f",$bytes));
    echo  "<br/>";
    $bytes= fread($handle,"4");
    print_r(unpack("f",$bytes));
    echo  "<br/>";
?>

我使用代码获得了正确的输出。

Array ( [1] => 20150416 )
Array ( [1] => 1.0499999523163 )
Array ( [1] => 1.25 )
Array ( [1] => 1.0299999713898 )
Array ( [1] => 1.1900000572205 )
Array ( [1] => 509427008 )
Array ( [1] => 566125248 )
Array ( [1] => 509427008 ) 

现在我想以unpack("Lfffffff",$bytes)的形式将许多解压缩语句压缩为一个,包含以下代码。

<?php
    $handle = fopen('data', 'rb');
    fread($handle,"64");
    //it is no use to parse the first 64 bytes here.
    $bytes= fread($handle,"32");
    print_r(unpack("Lfffffff",$bytes));
?>

为什么我得到唯一一个输出,我的结果中没有其他解析数据?如何解决?

Array ( [fffffff] => 20150416 ) 

用notepad ++打开数据文件并通过插件检查 - TextFX。 这里只解析了96个字节,fread省略了前64个字节。

enter image description here

1 个答案:

答案 0 :(得分:0)

来自unpack doc

  

解压缩的数据存储在关联数组中。去完成   这个你必须命名不同的格式代码并将它们分开   斜线/。如果存在转发器参数,则每个数组   键将在给定名称后面有一个序列号。

试试这个例子:

<?php

$array = array (20150416, 1.0499999523163, 1.25, 1.0299999713898, 1.1900000572205, 509427008, 566125248, 509427008);

$output = pack('L', $array[0]);

for($i = 1; $i < 8; $i++) {
    $output .= pack('f', $array[$i]);
}   

print_r(unpack("LL/f7", $output));

?>

unpack("LL/f7", $output)中,第一个L引用 unsigned long 第二个L到数组中的索引(请参阅输出中的第一个元素) /(阅读答案的第一部分),f引用 float 7引用七个浮点值。

输出:

Array
(
    [L] => 20150416
    [1] => 1.0499999523163
    [2] => 1.25
    [3] => 1.0299999713898
    [4] => 1.1900000572205
    [5] => 509427008
    [6] => 566125248
    [7] => 509427008
)

在你的情况下应该是:

<?php
    $handle = fopen('data', 'rb');
    $bytes= fread($handle,"32");
    print_r(unpack("LL/f7",$bytes));
?>