(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.