Я имею:
$my_a = array(100, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
Это байтовый массив, который я хочу преобразовать в двоичные данные для использования с шифрованием. Что я делаю, это:
$bin_data = pack("C*", $my_a);
Чтобы проверить, правильно ли это, я изменяю это:
unpack("C*", $bin_data);
Проблема в том, что я никогда не получаю обратно byte_array. Что я делаю неправильно?
pack()
к сожалению, не может принимать ни одного аргумента массива. Вам нужно распаковать массив в дополнительные аргументы.
Вместо этого вы можете использовать следующее:
$packed = call_user_func_array("pack", array_merge(array("C*"), $my_a));
Это в основном объединит аргумент упаковки с вашим массивом данных и функцией call_user_func_array()
позвоню pack()
со всеми аргументами, извлеченными из данного массива, как одиночные аргументы, как необходимо.
Или же используйте оператор splat, если вы используете PHP 5.6+
$packed = pack('C*', ...$my_a);
Из руководства: Массивы и объекты Traversable могут быть распакованы в списки аргументов при вызове функций с помощью оператора …. Это также известно как оператор splat в других языках, включая Ruby.
Таким образом, массив распаковывается в отдельные аргументы, так же, как это нужно pack()
,
Вы не можете отправить массив для упаковки. Сделай это правильно с splat
оператор $bin_data = pack("C*", ...$my_a);
Около splat
...
: http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat