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