为啥不能以 unpack("Lfffffff",$bytes) 的形式将许多 unpack 语句压缩为一个?

Posted

技术标签:

【中文标题】为啥不能以 unpack("Lfffffff",$bytes) 的形式将许多 unpack 语句压缩为一个?【英文标题】:Why can't compress many unpack statements into one as the form of unpack("Lfffffff",$bytes)?为什么不能以 unpack("Lfffffff",$bytes) 的形式将许多 unpack 语句压缩为一个? 【发布时间】:2015-04-29 01:15:12 【问题描述】:
<?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个字节。

【问题讨论】:

您可以发布您的文件内容吗? 这是一个二进制文件,请告诉我如何将它粘贴到这里? 我已经将数据文件粘贴到外部链接中,管理员将帖子保持状态,现在我在这里重新发布并删除外部链接中的数据文件。 【参考方案1】:

来自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) 中,第一个Lunsigned long第二个L 指向数组中的索引(请参阅输出中的第一个元素)/(阅读答案的第一部分)和f 指的是float7 指的是七个浮点值。

输出:

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

【讨论】:

@it_is_a_literature 你测试我的例子吗? 我测试过了,没问题,我正在搜索格式的材料。在 "LL/f7" 中,数字 7 表示 f 将是 7 次,还有两个问题。 "LL/f7" ,LL 第一个 L 是 unsigned long,第二个 L 是什么意思? “LL/f7”中的/在这里是什么意思? @it_is_a_literature 第一个 L 指 unsigned long 第二个指数组中的索引(见第一个元素) / (阅读答案的第一部分)和f 指 float 和 7 到 7 个浮点值

以上是关于为啥不能以 unpack("Lfffffff",$bytes) 的形式将许多 unpack 语句压缩为一个?的主要内容,如果未能解决你的问题,请参考以下文章

为啥函数在 php 中以 @ 开头?像@unpack(xxx)? [复制]

Ruby:为啥 unpack('Q') 给出的结果与手动转换不同?

为啥我们不能直接在循环中使用“innerHTML”函数而不是连接文本以获得垂直书写列表?

为啥python 自动化测试 使用@ddt、@unpack后会都执行一次setUp函数?

在php中,$ 1 = "Hello World"合法吗 为啥

为啥 Visual Studio 2010 不“解包”系统变量?