(PHP 4, PHP 5, PHP 7, PHP 8)
unpack — Распаковывает данные из бинарной строки
Функция распаковывает данные из бинарной строки с учётом
формата, который задали в параметре format
.
Функция сохранит данные, которые распаковала, в ассоциативном массиве, если отдельным кодам форматов назначили имена и разделили слешем /. Функция добавит порядковый номер после имени ключа каждого элемента массива, если указали аргумент повторителя.
Следующие изменения внесли, чтобы функция соответствовала языку Perl:
format
Коды форматов объясняет описание функции pack().
string
Упакованные данные.
offset
Смещение, с которого требуется начать распаковку.
Функция возвращает ассоциативный массив, который содержит распакованные элементы
двоичной строки, или false
, если возникла ошибка.
Версия | Описание |
---|---|
7.2.0 | Типы float и double поддерживают как прямой, так и обратный порядок байтов. |
7.1.0 |
Добавили необязательный параметр offset .
|
Пример #1 Пример распаковки данных из двоичной строки функцией unpack()
<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("cchars/nint", $binarydata);
print_r($array);
?>
Результат выполнения приведённого примера:
Array ( [chars] => 4 [int] => 160 )
Пример #2 Пример работы функции unpack() с повторителем
<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("c2chars/nint", $binarydata);
print_r($array);
?>
Результат выполнения приведённого примера:
Array ( [chars1] => 4 [chars2] => 0 [int] => 40960 )
Обратите внимание, что PHP внутренне хранит целые значения как знаковые. Результатом будет отрицательное число, даже если указали беззнаковую распаковку, если распаковать большое значение с типом unsigned long с таким же размером, как у значения, которое PHP хранит внутри.
функция присвоит числовые индексы начиная с 1
, если не назвать элемент.
Функция перезапишет часть данных, поскольку нумерация каждого элемента
перезапускается с 1
для каждого такого элемента,
если будет больше одного безымянного элемента.
Пример #3 Пример работы функции unpack() с безымянными ключами
<?php
$binarydata = "\x32\x42\x00\xa0";
$array = unpack("c2/n", $binarydata);
var_dump($array);
?>
Результат выполнения приведённого примера:
array(2) { [1]=> int(160) [2]=> int(66) }
Обратите внимание, что первое значение спецификатора c
перезаписывается первым значением спецификатора n
.