ProfiPHPProfiPHP
Категория: Прочие функции PHP

Функция Pack

Функция Pack упаковывает данные в бинарную строку.
string pack( string $format [, mixed $args [, mixed $... ]] )
Функция Pack упаковывает заданные аргументы в бинарную строку согласно формату в параметре Format.

Идея этой функции была заимствована из Perl и все коды форматирования работают так же. Однако, есть некоторые отсутствующие коды форматирования, такие как код формата Perl "u".

Необходимо иметь в виду, что отличие между знаковыми и беззнаковыми значениями влияет только на Unpack функцию, тогда как функция Pack дает одинаковый результат для знаковых и беззнаковых кодов формата.

Параметр 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-заполнение до абсолютной позиции

Функция Pack возвращает бинарную строку, содержащую данные.

Пример использования функции смотрите на странице Работа с бинарными данными в PHP.

Необходимо отметить, что PHP сохраняет значения типа Integer как знаковые с машинно-зависимым размером (C тип long). Все числа, переданные как Integer, но выходящие за границы этого типа будут сохранены с типом Float. При упаковке этих Float как Integer, они будут переданы с типом Integer. Это может как совпадать, так и нет с заданным шаблоном.

Наиболее частым является случай, когда упаковываются беззнаковые числа типа Integer. В системах, где Integer имеет размер в 32 бита, число обычно передается по тому же шаблону, как если бы Integer был беззнаковым (хотя, это зависит от определенных преобразований из знаковое в беззнаковое, согласно стандарту С). В системах, где тип Integer имеет размер в 64 бита, тип Float не имеет мантиссы, достаточной по размеру для хранения значения без потери точности. Если эти системы также имеют простой 64-битный С тип int (большинство UNIX систем не имеют), то единственным путем для использования формата I в верхнем разряде является создание отрицательных Integer значений с тем же представлением как и в определенном беззнаковом значении.

Добавить комментарий

Имя:
Текст комментария: