unpack

(PHP 4, PHP 5, PHP 7)

unpackРаспаковать данные из бинарной строки

Описание

unpack ( string $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.

Смотрите также

  • pack() - Упаковать данные в бинарную строку