如何在Perl中创建二进制文件?

时间:2009-09-23 06:06:32

标签: perl file-io binary

例如,我想创建一个名为sample.bin的文件,并输入一个数字,如255,这样就可以将255保存在文件中作为little-endian,FF 00.或3826到F2 0E。

我尝试使用binmode,正如perldoc所说。

3 个答案:

答案 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头文件(来自目录或脚本中的变量)。它使用标题中的信息到packunpack二进制数据。

当然,如果你想使用这个模块,有助于了解一些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 stictuse 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中犯下了暴行。这是很久以前的事了。我希望我能忘记它......