(PHP 4, PHP 5, PHP 7)
unpack — Распаковать данные из бинарной строки
$format
, string $data
[, int $offset
= 0
] ) : array
Распаковывает данные из бинарной строки в массив в соответствии с заданным в
format
формате.
Распакованные данные хранятся в ассоциативном массиве. Для осуществления этого необходимо обозначить различные коды форматов и разделить их с помощью слеша /. Можно также передать замещающий аргумент, с помощью которого каждый ключ массива будет иметь порядковый номер после заданного имени.
format
См. функцию pack() для разъяснения кодов форматов.
data
Упакованные данные.
offset
Смещение, с которого необходимо начать распаковку.
Возвращает ассоциативный массив, содержащий распакованные элементы бинарной строки.
Версия | Описание |
---|---|
7.2.0 | Типы float и double поддерживают как обратный, так и прямой порядок передачи байтов. |
7.1.0 |
Добавлен необязательный параметр offset .
|
5.5.0 |
Для поддержания совместимости с Perl сделано следующее: Код "a" теперь сохраняет завершающие NULL-байты. Код "A" теперь удаляет все завершающие пробельные символы ASCII (пробелы, табуляцию, переносы строк, возврат каретки, и NULL-байты). Код "Z" добавлен для NULL-дополненными строками и удаляет завершающие NULL-байты. |
Пример #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 хранит целые значения со знаком (signed). Если распаковать значение типа large unsigned long и оно будет иметь тот же размер, что и хранимое значение PHP, то результатом будет отрицательное число, даже если было указано распаковывать без знака (unsigned).
Если не назвать элемент, то будут использованы числовые индексы, начиная с 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.