(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 хранит целые значения как знаковые. Если распаковать значение с типом large 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
.