Функция Pack
Функция Pack
pack (шаблон, список);
Упаковывает список в двоичную структуру по шаблону. Шаблон - это строка символов, описывающая порядок и тип упакованных значений.
- A - текстовая строка, добавляется пробелами.
- a - текстовая строка, добавляется 0 символом.
- b - битовая строка (возрастающая нумерация бит)
- B - битовая строка (убывающая нумерация бит)
- h - шестнадцатеричная строка ( младший байт - первый)
- H - шестнадцатеричная строка (старший байт первый)
- c - символ со знаком
- C - символ без знака.
- s - короткое целое (один байт) со знаком.
- S - короткое целое без знака.
- i - целое (два байта) со знаком.
- I - целое без знака.
- l - длинное целое (4 байта) со знаком.
- L - длинное целое без знака.
- n - короткое в "сетевом" формате.
- N - длинное в "сетевом" формате.
- v - короткое в "VAX" формате.
- V - длинное в "VAX" формате.
- f - single float.
- F - double float.
- p - указатель на строку ограниченную 0.
- P - указатель на структуру с фиксированной длиной.
- u - упаковка uuencode.
- x - нуль-байт
- X - резервный байт.
- @ - заполнить нулями позицию.
За каждой буквой может стоять число означающее количество повторов. Для всех типов за исключением 'a', 'A', 'b', 'B', 'h' и 'H', упаковывается максимально возможное количество значений из списка. Символ '*' после типа означает использовать оставшиеся параметры. Тип 'a' и 'A' использует только одно значение из списка и добавляет остаток поля либо нуль-символами, либо пробелами (при распаковке по типу 'A' пробелы и нули отбрасываются, а по 'a' - нет). Типы 'b' и 'B' упаковывают строку в указанное число бит. Так же как и 'h' и 'H' в число ниблов (байт). 'P' - упаковывает указатель на структуру с указанной длиной. Числа с плавающей запятой (floats и double) записываются в стандартном для каждой машины формате и могут быть разными для разных типов машин. Заметьте, что Perl всегда использует двойную точность (double), поэтому упаковка и распаковка по типу 'f' приведет к потере точности. Шаблоны для распаковки и упаковки совершенно одинаковы.
print(pack("ccc",65,66,67)); # Результат ABC print(pack("A4A3","ab","cdefg")); # "ab cde" print(pack("a4a3","ab","cdefg")); # "ab\0\0cde"