举例来说,我想创建一个名为
我按照perldoc中所说的方法使用了binmode。
sample.bin
的文件,并输入一个数字,比如255,以便将255以小端格式保存在文件中,即FF 00。或者将3826转换为F2 0E。我按照perldoc中所说的方法使用了binmode。
open( my $out, '>', 'sample.bin') or die "Blah $!";
。 - daotoadpack
来生成二进制数据。对于复杂结构,Convert::Binary::C特别方便。pack
或unpack
二进制数据。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并没有真正发挥其作用,因为它只使用了一个短整型。如果您需要处理可能从几个不同的C头文件中提取typedef的复杂结构体,那么有了这个工具,您将感到非常高兴。
由于您是Perl的新手,我建议您始终使用use strict
和use warnings
。此外,您可以使用use diagnostics
来获取更详细的错误消息解释。无论是本网站还是Perlmonks都有很多适合初学者的好信息和许多非常聪明、熟练的人愿意帮助您。
顺便说一句,如果您决定使用pack
,请查看pack教程,它有助于澄清有些令人费解的pack文档。
是的,使用binmode
为了您的娱乐(如果不是教育),我第一次尝试创建二进制文件时包括了binmode STDOUT
和以下内容:
sub output_word {
$word = $_[0];
$lsb = $word % 256;
$msb = int($word/256);
print OUT chr($lsb) . chr($msb);
return $word;
}
求你了,别用这段代码!它来自于我不懂更好的写法的时候。
虽然可以说我现在还是不太懂,但我把它重现在这里是为了展示即使使用愚蠢的方法,你也能够控制字节的顺序,并且因为我需要坦白。
一个更好的方法是使用像Adam Batkin建议的pack
。
我想我在 Perl 4 中犯了上述暴行。那是很久以前的事了。我真希望我能忘掉它...