pack

Синтаксис

pack TEMPLATE, LIST

Описание

Функция принимает список значений и упаковывает их в двоичную структуру, возвращая строку, в которой содержится эта структура. Шаблон TEMPLATE представляет собой последовательность символов, которые определяют тип и порядок следования значений в формируемой структуре следующим образом:
A строка ASCII с заполнением пробелами a строка ASCII с заполнением нулями (0x00)
b битовая строка с возрастанием порядка следования битов, подобно vec() B битовая строка с уменьшением порядка следования битов
h 16-ричная строка (младшая цифра вначале) H 16-ричная строка (старшая цифра вначале)
c байт со знаком C байт без знака
s короткое целое со знаком S короткое целое без знака
i целое со знаком I целое без знака
l длинное целое со знаком L длинное целое без знака
n короткое целое в "сетевом формате" N длинное целое в "сетевом формате"
v короткое в формате "VAX" (остроконечный) V длинное в формате "VAX"
f число с плавающей запятой одинарной точности в обычном формате d число с плавающей запятой двойной точности в обычном формате
p указатель на ASCIZ-строку P указатель на структуру, представляющую собой строку фиксированной длины
u строка в кодировке UUENCODE w упакованное целое число. Байты используются как беззнаковое целое по модулю 128, в формате MSB, в котором восьмой бит всех байтов, кроме последнего, установлен в 1
x пустой байт X резервирование места для байта
@ заполнитель до достижения абсолютной позиции в файле    

За каждой из букв в шаблоне может следовать число, которое представляет собой счетчик повторений. Для всех типов, исключая "а", "А", "b", "В", "h", "H" и "Р", функция pack будет поглощать указанное количество значений из списка LIST. Если же в качестве счетчика повторений указать *, то данный шаблон будет использоваться для представления всех оставшихся объектов в списке. Спецификаторы "а" и "А" поглощают ровно одно значение, но упаковывают его как строку заданной длины, заполняя, по необходимости, пробелами или нулевыми байтами.
Аналогичным образом, поля "b" и "В" упаковывают строку, содержащую указанное число битов. Спецификаторы "h" и "Н" упаковывают строку из указанного числа шестнадцатеричных цифр. Спецификатор "Р" указывает на структуру указанного размера. Вещественные числа представляются в формате, специфичном для архитектуры процессора, на котором запускается программа. Это связано с многочисленностью различных форматов представления чисел с плавающей запятой и отсутствием стандартного "сетевого" формата. Это означает, что числа с плавающей запятой, упакованные на одном компьютере, могут оказаться нечитаемыми на втором, даже если на обоих машинах используется плавающая арифметика в стандарте IEEE.
Обратите также внимание на то, что для всех внутренних вычислений Perl использует вещественные числа двойной точности, и преобразование их в числа с одинарной точностью может привести к потере точности, в результате чего unрасk("f", pack) в общем случае не равно $fоо.
Примеры использования функции pack:
$foo = pack("cccc", 65, 66, 67, 68);      # foo равно "ABCD"
$foo = pack("c4", 65, 66, 67, 68);        # то же самое
$foo = pack("ccxxcc", 65, 66, 67, 68);    # равно "AB\0\0CD"
$foo = pack("s2",1, 2);                   # "\1\0\2\0" в остроконечной системе 
                                          # "\0\1\0\2" в тупоконечной
$foo = pack("a4", "abcd", "х", "у", "z"); # "abcd" 
$foo = pack("aaaa","abcd","x","y","z");   # "axyz"
$foo = pack("a14","abcdefg");             # "abcdefg\0\0\0\0\0\0\0"
$foo = pack("i9pl", gmtime);              # вполне реальная структура tm
sub bintodec {
  unpack("N", pack("B32", substr("0" x 32, shift, -32))); 
}
В целом шаблоны обладают обратимостью и могут использоваться функцией unpack



2011-04-26 00:53:16 lykich

Thanks




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: