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() - Упаковывает данные в двоичную строку
To Top