|
(PHP 3, PHP 4)
pack - упаковывает данные в бинарную строку. Описаниеstring pack (string format [, mixed args])
Упаковывает данные аргументы в бинарную строку в соответствии с форматом
format. Возвращает бинарную строку с данными.
Идея этой функции была взята из Perl, и весь код форматирования работает аналогично, однако отсутствуют некоторые коды форматирования, такие как
Perl'овский "u". Строка форматирования состоит из кодов форматирования и
последующего необязательного аргумента повторения/repeater. Аргумент repeater может быть целочисленным или
* для повторения до конца данных ввода. Для a, A, h, H повторение
специфицирует, сколько символов аргумента data принимается, для @ это
абсолютная позиция для размещения следующих данных, для других параметров
повторение специфицирует, сколько аргументов данных употребляется и
упаковывается в результирующую бинарную строку. В настоящее время реализованы:
строка с NUL-заполнением строка со SPACE-заполнение
h Hex-строка, сначала нижний разряд H Hex-строка, сначала высший разряд
c знаковый char C беззнаковый char s знаковый short (всегда 16 бит, машинный байтовый порядок)
S беззнаковый short (всегда 16 бит, машинный байтовый порядок)
n беззнаковый short (всегда 16 бит, байтовый порядок big endian)
v беззнаковый short (всегда 16 бит, байтовый порядок little endian)
i signed integer (машиннозависимый размер и байтовый порядок)
I беззнаковый integer (машиннозависимый размер и байтовый порядок)
l signed long (всегда 32 бита, машинный байтовый порядок)
L беззнаковый long (всегда 32 бита, машинный байтовый порядок)
N беззнаковый long (всегда 32 бита, байтовый порядок big endian)
V беззнаковый long (всегда 32 бита, байтовый порядок little endian)
f float (машиннозависимый размер и представление)
d double (машиннозависимый размер и представление) x NUL байт
X обратно на один байт @ NUL-заполнение до абсолютной позиции
Пример 1. Строка форматирования pack()
$binarydata = pack ("nvc*", 0x1234, 0x5678, 65, 66);
|
Результирующая бинарная строка имеет длину 6 байт и содержит байтовую
последовательность 0x12, 0x34, 0x78, 0x56, 0x41, 0x42. |
Обратите внимание, что отличие между знаковым и беззнаковым значением влияет только на функцию unpack(), а функция
pack() даёт одинаковые результаты для знакового и беззнакового кода формата.
Отметьте также, что PHP внутренне хранит значения integer как знаковые значения машиннозависимого размера. Если вы задаёте значение как
беззнаковое integer, слишком большое, чтобы хранить его таким способом, оно конвертируется во
float, что часто приводит к непредсказуемым результатам. | |