2009-09-23 3 views
32

Например, я хочу создать файл с именем sample.bin и поместить число, например 255, чтобы 255 был сохранен в файле как little-endian, FF 00. Или от 3826 до F2 0E.Как создать двоичный файл в Perl?

Я пробовал использовать binmode, как сказал perldoc.

+2

Что случилось с вами, что кто-то действительно проголосовал за этот вопрос? –

+0

Я считаю, что моя грамматика не так хороша и плохо структурирована. – domlao

+1

+1 к офсету -1, это и это Perl. Чувство субъективного. : D –

ответ

38

Функция 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 содержится дополнительная информация о выполнении операций ввода-вывода в разных форматах.

+0

wow я вижу спасибо. im new для PERL, поэтому я думаю, что я посетил perldoc для функции pack. спасибо – domlao

+0

пакет приятная функция. Обратите особое внимание на то, какие символы шаблона предназначены для кодирования значений little-endian vs. big-endian – mob

+0

благодаря Адаму и mobrule. пакет совершенен! thanks – domlao

4

Да, использование 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. Это было давно. Хотел бы я этого забыть ...

+3

Я посмотрел в каком-то старом кодексе, который недавно думал, что это потрясающе. Это было дерьмо, и я не много программировал в течение двух лет. Я где-то читал, что, если вы не думаете, что ваш старый код дерьмо, тогда с вами что-то не так. .... хочу, чтобы я вспомнил, это была отличная статья. –

+1

Огромное спасибо тому, кто поддержал меня. Теперь я могу удалить исходный файл, на который я висел, и начать процесс исцеления. – pavium

+1

Если вам не нравится ваш ответ, вы можете его удалить. –

8

Вы можете использовать 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, это поможет прояснить несколько загадочную документацию пакета.

+0

спасибо за советы, а за ссылку на учебник по сборке :) – domlao