pack
(PHP 4, PHP 5, PHP 7)
pack — Упаковать данные в бинарную строку
Описание
Упаковывает заданные аргументы в бинарную строку в соответствии с форматом в параметре
format
.
Идея этой функции была заимствована из Perl и все коды форматирования работают так же. Однако, есть некоторые отсутствующие коды форматирования, такие как код формата Perl "u".
Необходимо иметь в виду, что отличие между знаковыми и беззнаковыми значениями влияет только на функцию unpack(), тогда как функция pack() дает одинаковый результат для знаковых и беззнаковых кодов формата.
Список параметров
-
format
-
Параметр
format
задается в виде строки и состоит из кодов формата и опционального аргумента повторения. Аргумент может быть целочисленным, либо*
для повторения до конца введенных данных. Для a, A, h, H число повторений определяет то, сколько символов взято от одного аргумента данных, для @ - это абсолютная позиция для размещения следующих данных, для всего остального число повторений определяет как много аргументов данных было обработано и упаковано в результирующую бинарную строку.Работающие на данный момент форматы:
Символы форматов функции pack() Код Описание a Строка (string) с NUL-заполнением A Строка (string) со SPACE-заполнением h Hex-строка (Hex string), с нижнего разряда H Hex-строка (Hex string), с верхнего разряда c знаковый символ (char) C беззнаковый символ (char) s знаковый short (всегда 16 бит, машинный байтовый порядок) S беззнаковый short (всегда 16 бит, машинный байтовый порядок) n беззнаковый short (всегда 16 бит, порядок big endian) v беззнаковый short (всегда 16 бит, порядок little endian) i знаковый integer (машинно-зависимый размер и порядок) I беззнаковый integer (машинно-зависимый размер и порядок) l знаковый long (всегда 32 бит, машинный порядок) L беззнаковый long (всегда 32 бит, машинный порядок) N беззнаковый long (всегда 32 бит, порядок big endian) V беззнаковый long (всегда 32 бит, порядок little endian) q signed long long (всегда 64 bit, машинный порядок) Q беззнаковый long long (всегда 64 bit, машинный порядок) J беззнаковый long long (всегда 64 bit, порядок big endian) P беззнаковый long long (всегда 64 bit, порядок little endian) f float (машинно-зависимые размер и представление) g float (машинно-зависимые размер, порядок байт little endian) G float (машинно-зависимые размер, порядок байт big endian) d double (машинно-зависимые размер и представление) e double (машинно-зависимые размер, порядок байт little endian) E double (машинно-зависимые размер, порядок байт big endian) x байт NUL X Резервирование одного байта Z Строка (string) с NUL-заполнением (добавлено в PHP 5.5) @ NUL-заполнение до абсолютной позиции -
values
-
Возвращаемые значения
Возвращает бинарную строку, содержащую данные, или false
в случае возникновения ошибки.
Список изменений
Версия | Описание |
---|---|
8.0.0 |
Функция больше не возвращает false в случае возникновения ошибки.
|
7.2.0 | Типы float и double поддерживают как обратный, так и прямой порядок передачи байтов. |
7.0.15,7.1.1 | Добавлены коды "e", "E", "g" и "G" для поддержки принудительного указания порядка байт для float и double. |
5.6.3 | Добавлены коды "q", "Q", "J" и "P" для поддержки 64-bit чисел. |
5.5.0 | Добавлен код "Z", работающий аналогично "a" для совместимости с Perl. |
Примеры
Пример #1 Пример использования pack()
<?php
$binarydata = pack("nvc*", 0x1234, 0x5678, 65, 66);
?>
Полученная бинарная строка длиной 6 байт будет содержать последовательность байтов 0x12, 0x34, 0x78, 0x56, 0x41, 0x42.
Примечания
Необходимо отметить, что PHP сохраняет значения типа int как
знаковые с машинно-зависимым размером (C тип long
).
Все числа, переданные как int, но выходящие за границы этого типа будут сохранены с типом float.
При упаковке этих float как int, они будут переданы с типом int. Это может как совпадать, так и нет с заданным шаблоном.
Наиболее частым является случай, когда упаковываются беззнаковые числа типа int. В системах, где int имеет размер в 32 бита, число обычно передается по тому же шаблону, как если бы int был беззнаковым (хотя, это зависит от определенных преобразований из знаковое в беззнаковое, согласно стандарту С). В системах, где тип int имеет размер в 64 бита, тип float не имеет мантиссы, достаточной по размеру для хранения значения без потери точности. Если эти системы также имеют простой 64-битный С тип int
(большинство UNIX систем не имеют), то единственным путем для использования формата I
в верхнем разряде является создание отрицательных int значений с тем же представлением как и в определенном беззнаковом значении.