unpack

(PHP 4, PHP 5, PHP 7, PHP 8)

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

Описание

unpack(string $format, string $string, int $offset = 0): array|false

Функция распаковывает данные из бинарной строки с учётом формата, который задали в параметре format.

Распакованные данные хранятся в ассоциативном массиве. Чтобы распаковать данные, указывают коды форматов и разделяют коды слешем /. Если аргумент повторителя указали, у каждого ключа массива после заданного имени будет порядковый номер.

Чтобы функция соответствовала языку Perl, внесли следующие изменения:

  • Код «a» теперь сохраняет конечные NULL-байты.
  • Код «A» теперь удаляет конечные пробельные ASCII-символы (пробелы, табуляцию, переносы строк, возврат каретки и NULL-байты).
  • Код «Z» добавили для NULL-дополненных строк и удаления конечных NULL-байтов.

Список параметров

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.

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

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