(PHP 4, PHP 5, PHP 7)
unpack — Распаковывает данные из бинарной строки
$format
, string $data
)
Распаковывает данные из бинарной строки в массив согласно заданному в
format
формату.
Распакованные данные хранятся в ассоциативном массиве. Для осуществления этого необходимо обозначить различные коды форматов и разделить их с помощью слеша "/". Можно также передать замещающий аргумент, с помощью которого каждый ключ массива будет иметь порядковый номер после обозначенного имени ключа.
format
См. функцию pack() для разъяснения кодов форматов.
data
Упакованные данные.
Возвращает ассоциативный массив, содержащий распакованные элементы бинарной строки.
Версия | Описание |
---|---|
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.