【问题标题】: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个字节。

【问题讨论】:

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

标签: php arrays file binaryfiles unpack


【解决方案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 个浮点值
猜你喜欢
  • 2022-06-10
  • 1970-01-01
  • 2012-06-18
  • 2020-08-26
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多