web-dev-qa-db-ja.com

Perlでバイナリファイルを作成するにはどうすればよいですか?

たとえば、sample.binというファイルを作成し、255などの数値を入力して、255がリトルエンディアンFF 00としてファイルに保存されるようにする、または3826からF2 0Eに変更する場合を考えます。

Perldocが言ったように、私はbinmodeを使ってみました。

36
domlao

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 のマニュアルページには、さまざまな形式でI/Oを実行するための情報が少しあります。

43
Adam Batkin

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は単一のshort intで動作しているだけなので、この例では本当にうまくいきません。いくつかの異なるCヘッダーからtypedefがプルされている可能性のある複雑な構造を処理する必要がある場合は、このツールを手に入れると非常に満足します。

あなたはPerlに慣れていないので、常にuse stictおよびuse warnings。また、use diagnosticsエラーメッセージの詳細な説明を取得します。このサイトと Perlmonks の両方には、初心者向けの優れた情報がたくさんあり、多くの非常に賢く熟練した人があなたを助けてくれます。

ところで、packルートに行くことにした場合は、 pack tutorial を確認してください。これは、やや不可解なパックのドキュメントを明確にするのに役立ちます。

10
daotoad

はい、binmodeを使用します

あなたの娯楽(そうでなければ教育)バイナリファイルを作成する最初の試みbinmode STDOUTと以下:

sub output_Word {
    $Word = $_[0];
    $lsb  = $Word % 256;
    $msb  = int($Word/256);
    print OUT chr($lsb) . chr($msb);
    return $Word;
} 

PITYの酒のためにこのコードを使用しないでください!それは私がこれ以上知りませんでしたから来ています。

私はまだそうではないかもしれないと主張するかもしれませんが、ここで再現して、あなたができることを示すためにここに再現されます脳死メソッドでも、そして私がする必要があるため気をつけて。

より良い方法は Adam Batkin が示唆するようにpackを使用することです。

私はPerl 4で上記の残虐行為を犯したと思います。それはずっと前のことです。忘れられたらいいのに...

6
pavium