【问题标题】:php difference between pack() and unpack()php pack() 和 unpack() 的区别
【发布时间】:2013-07-28 10:19:34
【问题描述】:

在 php 4.4.4 中具有:

$hbc=pack("LL",82603088,82602992);
list($v1,$v2)=unpack("L2",$hbc);
echo("v1=".$v1." v2=".$v2);

结果是:

v1=v2=82603088

我已经有好几个小时来处理这个问题了…… 谢谢

【问题讨论】:

  • 如果我做$ar=unpack("C*",$hbc);echo(implode(", ",$ar));,我会得到80、108、236、4、240、107、236、4,没关系...

标签: php pack unpack


【解决方案1】:

错误不在打包或解包中,而是在list()内部。

打开通知!你的代码会这样抱怨:

Notice: Undefined offset: 0 in ...

这应该让你感到好奇。如果你dump了unpack返回的数组,那就是正确的:

array(2) {
  [1] =>
  int(82603088)
  [2] =>
  int(82602992)
}

然后在list() 的文档页面上有一个小小的注释:

list() 仅适用于数值数组,并假定数值索引从 0 开始。

你的数组不是从索引 0 开始的,通知很想告诉你。

快速解决方法是:

list(,$v1,$v2)=unpack("L2",$hbc); // add a comma to skip index 0

更好的方法可能是使用unpack 创建命名数组索引:

$unpacked = unpack("L2v/",$hbc);

结果:

array(2) {
  'v1' =>
  int(82603088)
  'v2' =>
  int(82602992)
}

【讨论】:

  • 我必须承认我没有对解包的例子给予足够的关注,但是从 返回一个包含二进制字符串解包元素的关联数组基于 0。谢谢。
【解决方案2】:

来自 php.net comments

$int_list = array_merge(unpack("s*", $some_binary_data));

这实际上会从 0 开始重置您的索引键。

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多