Например, я хочу создать файл с именем sample.bin
и поместить число, например 255, чтобы 255 был сохранен в файле как little-endian, FF 00. Или от 3826 до F2 0E.Как создать двоичный файл в Perl?
Я пробовал использовать binmode, как сказал perldoc.
Например, я хочу создать файл с именем sample.bin
и поместить число, например 255, чтобы 255 был сохранен в файле как little-endian, FF 00. Или от 3826 до F2 0E.Как создать двоичный файл в Perl?
Я пробовал использовать binmode, как сказал perldoc.
Функция perl pack вернет «двоичные» данные в соответствии с шаблоном.
open(my $out, '>:raw', 'sample.bin') or die "Unable to open: $!";
print $out pack('s<',255) ;
close($out);
В приведенном выше примере, 's'
говорит его для вывода short
(16 бит), а '<'
силы его в режим прямой порядок байтов.
Кроме того, ':raw'
в вызове open
говорит его поместить дескриптор в двоичном режиме на платформах, где это имеет значение (это эквивалентно использованию binmode
). На странице руководства PerlIO содержится дополнительная информация о выполнении операций ввода-вывода в разных форматах.
wow я вижу спасибо. im new для PERL, поэтому я думаю, что я посетил perldoc для функции pack. спасибо – domlao
пакет приятная функция. Обратите особое внимание на то, какие символы шаблона предназначены для кодирования значений little-endian vs. big-endian – mob
благодаря Адаму и mobrule. пакет совершенен! thanks – domlao
Да, использование binmode
Для вашего развлечений (если не образование) моя самая первая попытка создать двоичный файл включен binmode STDOUT
и следующее:
sub output_word {
$word = $_[0];
$lsb = $word % 256;
$msb = int($word/256);
print OUT chr($lsb) . chr($msb);
return $word;
}
помилуйте НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД! Это происходит из того времени, когда я не знал ничего лучшего.
Можно утверждать, что я до сих пор этого не делаю, но он воспроизводится здесь, чтобы показать, что вы можете управлять порядком байтов, даже с помощью мозговых методов, и потому, что мне нужно «испортить».
Лучшим методом было бы использовать pack
, поскольку предлагалось Adam Batkin.
Я думаю, что совершил зверство выше в Perl 4. Это было давно. Хотел бы я этого забыть ...
Я посмотрел в каком-то старом кодексе, который недавно думал, что это потрясающе. Это было дерьмо, и я не много программировал в течение двух лет. Я где-то читал, что, если вы не думаете, что ваш старый код дерьмо, тогда с вами что-то не так. .... хочу, чтобы я вспомнил, это была отличная статья. –
Огромное спасибо тому, кто поддержал меня. Теперь я могу удалить исходный файл, на который я висел, и начать процесс исцеления. – pavium
Если вам не нравится ваш ответ, вы можете его удалить. –
Вы можете использовать pack
для генерации ваших двоичных данных. Для сложных структур Convert::Binary::C особенно приятен.
CBC анализирует файлы заголовков C (либо из каталога, либо из переменной в вашем скрипте). Он использует информацию из заголовков в pack
или unpack
двоичных данных.
Конечно, если вы хотите использовать этот модуль, он помогает знать некоторые C.
CBC дает возможность определить порядок следования байтов и размеров для ваших типов C, и вы даже можете указать функции для преобразования между нативными типами Perl и данными в двоичном файле. Я использовал эту функцию для обработки кодирования и декодирования чисел с фиксированной точкой.
Для вашего очень простого примера вы будете использовать:
use strict;
use warnings;
use IO::File;
use Convert::Binary::C;
my $c = Convert::Binary::C->new('ByteOrder' => 'LittleEndian');
my $packed = $c->pack('short int', 0xFF);
print $packed;
my $fh = IO::File->new('outfile', '>')
or die "Unable to open outfile - $!\n";
$fh->binmode;
$fh->print($packed);
CBC не реально получить, чтобы блистать в этом примере, так как он просто работает с одним коротким междунар.Если вам нужно обрабатывать сложные структуры, которые могут быть напечатаны typedefs из нескольких разных заголовков C, вы будете очень рады иметь этот инструмент под рукой.
Поскольку вы новичок в Perl, я предлагаю вам всегда use stict
и use warnings
. Кроме того, вы можете написать use diagnostics
, чтобы получить более подробные пояснения к сообщениям об ошибках. На этом сайте и Perlmonks есть много хорошей информации для начинающих и многих очень умных, опытных людей, которые готовы помочь вам.
BTW, если вы решите пойти по маршруту pack
, ознакомьтесь с pack tutorial, это поможет прояснить несколько загадочную документацию пакета.
спасибо за советы, а за ссылку на учебник по сборке :) – domlao
Что случилось с вами, что кто-то действительно проголосовал за этот вопрос? –
Я считаю, что моя грамматика не так хороша и плохо структурирована. – domlao
+1 к офсету -1, это и это Perl. Чувство субъективного. : D –