帮助理解PHP的unpack
。
我知道在红宝石中我可以用某种方式解压缩:
PHP中的“ABCDEFGH-ABCDEFGH-ABCDEFGH-ABCDEFGH” .unpack( “NNNNNN”)
=> [1633837924,25958,26472,11617,25187,1684366951]
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
功能的正确方法吗?
答案 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)
}
它实际上是您链接的文档:
<强>注意强> 请注意,如果未命名元素,则使用空字符串。如果你没有命名多个元素,这意味着一些数据会被覆盖,因为密钥是相同的[...]