Язык программирования Perl



              

Ввод-вывод двоичных данных


Двоичные данные обычно хранятся в файлах без разделителей записей в блоках фиксированной длины. После открытия двоичного файла функцией open() нужно установить режим обработки двоичных данных с помощью функции binmode().

open(my $fh, ">$file") or die("Ошибка открытия: $!"); binmode($fh);

Запись двоичных данных или данных фиксированной длины может выполняться с помощью функции print($fh $record). Также имеется функция небуферизованного вывода syswrite(), которой при вызове указываются три аргумента: файловый манипулятор, скалярная переменная с выводимыми данными и размер записываемого блока данных. Эта функция возвращает число фактически записанных байт, что можно использовать для проверки успешности записи. Это делается так:

syswrite($fh, $record, length($record)) == length($record) or die("Ошибка записи: $!");

Преобразование данных к двоичному виду производит функция pack(), которая упаковывает в скалярную переменную список значений в соответствии с указанным шаблоном. В шаблоне каждое преобразуемое поле обозначается с помощью латинской буквы. Полный перечень шаблонов преобразования для функций pack() и unpack() приводится в таблице 9.2. За каждым символом в шаблоне может следовать десятичное число, которое рассматривается как ширина преобразуемого поля. Поля в шаблоне могут разделяться пробелами для удобства чтения.

Таблица 9.2. Шаблоны упаковки и распаковки данных

ШаблонМнемоникаОписание преобразования
aArbitraryпроизвольная последовательность байтов, дополненная нулевым байтом \0
AASCIIстрока символов ASCII, дополненная пробелами
b / BBit stringстрока битов с возрастающим / убывающим порядком битов
c / CCharacterоднобайтовые символы со знаком / без знака
f / dFloat / Doubleчисло с плавающей точкой одинарной / двойной точности
FFloatчисло с плавающей точкой одинарной точности во внутреннем представлении (NV)
Dlong Doubleдлинное число с плавающей точкой двойной точности
h / HHex stringшестнадцатеричная строка с младшим / старшим полубайтом (nybble) в начале
i / IIntegerцелое (>=32 бита) число со знаком / без знака
j / Jцелое во внутреннем представлении со знаком (IV) / без знака (UV)
l / LLongдлинное (32 бита) целое со знаком / без знака
n / NNetworkбеззнаковое короткое (16 битов) / длинное (32 бита) целое с сетевым порядком байтов (big endian)
p / PPointerуказатель на строку, оканчивающуюся \0 / фиксированной длины
q / QQuadсверхдлинное (64 бита) целое число со знаком / без знака
s / SShortкороткое (16 битов) целое со знаком / без знака
uuuencodedстрока, кодированная по алгоритму uuencode
UUnicodeстрока символов Unicode
v / VVAXбеззнаковое короткое (16 битов) / длинное (32 бита) целое с VAX-порядком байтов (little endian)
wцелое, сжатое в соответствии с кодировкой BER
xвставка \0 (pack) / пропуск байта по направлению вперед (unpack)
Xпропуск байта по направлению назад
ZASCIIZстрока ASCIIZ (оканчивающаяся \0), дополненная \0
@заполнение \0 до указанной позиции




Содержание  Назад  Вперед