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
Thanks
2023-11-16 22:30:18 Svetlana Thank you very useful information
Оставить комментарий:
|
|