为啥不能以 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)
中,第一个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));
?>
【讨论】:
@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函数?