奇怪的行为PHP解包

时间:2015-08-13 22:42:23

标签: php unpack

帮助理解PHP的unpack

是如何工作的

我知道在红宝石中我可以用某种方式解压缩:

  

“ABCDEFGH-ABCDEFGH-ABCDEFGH-ABCDEFGH” .unpack( “NNNNNN”)

     

=> [1633837924,25958,26472,11617,25187,1684366951]

PHP中的

Given the documentation也是如此。但实际上它并没有真正起作用。

我需要6个元素的数组。让我们尝试一下......

$bytes = openssl_random_pseudo_bytes(16);

var_dump(unpack("NnnnnN", $bytes));

array(1) {
  ["nnnnN"]=>
  int(2679895791)
}

var_dump(unpack("N/n/n/n/n/N", $bytes));

array(1) {
  [1]=>
  int(600384068)
}

var_dump(unpack("N1/n1/n1/n1/n1/N1", $bytes));

array(1) {
  [1]=>
  int(600384068)
}

var_dump(unpack("N1n1n1n1n1N", $bytes));

array(1) {   ["n1n1n1n1N"]=>   int(2679895791) }

我找到了解决方法:

var_dump(array_values(unpack("N1a/n1b/n1c/n1d/n1e/N1f", $bytes)));
array(6) {
  [0]=>
  int(2679895791)
  [1]=>
  int(39295)
  [2]=>
  int(42804)
  [3]=>
  int(32471)
  [4]=>
  int(39559)
  [5]=>
  int(600384068)
}

但我认为有一点黑魔法。如果没有unpack(如N1a)和aliases,请提示您使用array_values功能的正确方法吗?

1 个答案:

答案 0 :(得分:1)

没有。每种格式都由自己评估并覆盖以前的值:

var_dump(unpack("N", $bytes));

array(1) {
  [1]=>
  int(824184250)
}

var_dump(unpack("N/n", $bytes));

array(1) {
  [1]=>
  int(32979)
}

var_dump(unpack("N/n2", $bytes));

array(2) {
  [1]=>
  int(32979)
  [2]=>
  int(48930)
}

它实际上是您链接的文档:

  

<强>注意   请注意,如果未命名元素,则使用空字符串。如果你没有命名多个元素,这意味着一些数据会被覆盖,因为密钥是相同的[...]