Странное поведение PHP распаковать

Помогите понять, как работает 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?

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)
}

Это на самом деле в документации, которую вы связали:

предосторожность
Помните, что если вы не называете элемент, используется пустая строка. Если вы не называете более одного элемента, это означает, что некоторые данные перезаписываются, поскольку ключи совпадают […]

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]