array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ru', ), 'this' => array ( 0 => 'function.unpack.php', 1 => 'unpack', ), 'up' => array ( 0 => 'ref.misc.php', 1 => 'Разные функции', ), 'prev' => array ( 0 => 'function.uniqid.php', 1 => 'uniqid', ), 'next' => array ( 0 => 'function.usleep.php', 1 => 'usleep', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ru', 'path' => 'reference/misc/functions/unpack.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(PHP 4, PHP 5, PHP 7, PHP 8)
unpack — Распаковать данные из бинарной строки
Распаковывает данные из бинарной строки в массив в соответствии с заданным в
format
формате.
Распакованные данные хранятся в ассоциативном массиве. Для осуществления этого необходимо обозначить различные коды форматов и разделить их с помощью слеша /. Можно также передать замещающий аргумент, с помощью которого каждый ключ массива будет иметь порядковый номер после заданного имени.
Для поддержания совместимости с Perl сделано следующее:
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 хранит целые значения со знаком (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
.