Помогите понять, как работает PHP unpack
,
Я знаю, что в ruby я могу как-то распаковать:
«ABCDEFGH-ABCDEFGH-ABCDEFGH-ABCDEFGH» .unpack ( «NNNNNN»)
=> [1633837924, 25958, 26472, 11617, 25187, 1684366951]
Учитывая документацию в PHP тоже. Но на самом деле это не очень работает.
Мне нужен массив из 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
функция без aliases
(как N1a) и array_values
?
Нет. Каждый формат оценивается сам по себе и перезаписывает предыдущие значения:
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)
}
Это на самом деле в документации, которую вы связали:
предосторожность
Помните, что если вы не называете элемент, используется пустая строка. Если вы не называете более одного элемента, это означает, что некоторые данные перезаписываются, поскольку ключи совпадают […]
Других решений пока нет …