例如,我想创建一个名为sample.bin
的文件,并输入一个数字,如255,这样就可以将255保存在文件中作为little-endian,FF 00.或3826到F2 0E。
我尝试使用binmode,正如perldoc所说。
答案 0 :(得分:42)
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的更多信息。
答案 1 :(得分:9)
您可以使用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在这个例子中并没有真正发挥作用,因为它只是使用一个短的int。如果你需要处理可能从几个不同的C头中拉出typedef的复杂结构,你会很高兴有这个工具。
由于您不熟悉Perl,我建议您始终use stict
和use warnings
。此外,您可以use diagnostics
获取有关错误消息的更详细说明。这个网站和Perlmonks都有很多适合初学者的好信息,还有许多非常聪明,技术娴熟的人愿意帮助你。
pack
路线,请查看pack tutorial,这有助于澄清有些神秘的包文档。
答案 2 :(得分:5)
是的,使用binmode
对于娱乐(如果不是教育),我首次尝试创建包含binmode STDOUT
和以下内容的二进制文件:
sub output_word {
$word = $_[0];
$lsb = $word % 256;
$msb = int($word/256);
print OUT chr($lsb) . chr($msb);
return $word;
}
为了怜悯,请不要使用这个代码!它来自我不知道更好的时候。
可以说我还没有,但是这里再现它表明你可以控制字节的顺序,即使是用脑死方法,因为我需要'fess起来。
更好的方法是使用pack
作为Adam Batkin建议。
我认为我在Perl 4中犯下了暴行。这是很久以前的事了。我希望我能忘记它......