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

dom*_*lao 36 binary perl file-io

例如,我想创建一个调用的文件sample.bin并输入一个数字,如255,这样255就会以小端,FF 00或3826到F2 0E的形式保存在文件中.

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

Ada*_*kin 42

Perl pack函数将根据模板返回"二进制"数据.

open(my $out, '>:raw', 'sample.bin') or die "Unable to open: $!";
print $out pack('s<', 255);
close($out);
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,'s'告诉它输出一个short(16位),并'<'强制它进入小端模式.

另外,':raw'在调用中open告诉它将文件句柄放在重要的平台上的二进制模式(它相当于使用binmode).该PerlIO的手册有不同的格式做I/O多一点信息.

  • @Adam,请不要使用2参数形式的open.当与来自变量的文件名配对时,它会创建一个巨大的安全漏洞,等待被利用.使用词法文件句柄也是一个好主意(它限制了文件句柄的范围).您的公开声明应该重写为"open(我的$ out,'>','sample.bin')或者死"Blah $!"; (4认同)
  • 请记住,语言是Perl,解释器/编译器是perl.我并不是说迂腐,但错误地将语言资本化是一个常见的问题. (3认同)

dao*_*oad 10

您可以使用它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 );
Run Code Online (Sandbox Code Playgroud)

在这个例子中,CBC并没有真正发挥作用,因为它只是使用一个短的int.如果你需要处理可能从几个不同的C头中拉出typedef的复杂结构,你会很高兴有这个工具.

既然你是Perl的新手,我会建议你永远use stictuse warnings.此外,您还use diagnostics可以获得有关错误消息的更详细说明.这个网站和Perlmonks都为初学者提供了很多很好的信息,许多非常聪明,技术娴熟的人愿意帮助你.

顺便说一句,如果您决定走这pack条路线,请查看包装教程,它有助于澄清有些神秘的包文档.


pav*_*ium 6

是的,使用binmode

为了您的娱乐(如果不是教育),我首先尝试创建二进制文件,包括binmode STDOUT以下内容:

sub output_word {
    $word = $_[0];
    $lsb  = $word % 256;
    $msb  = int($word/256);
    print OUT chr($lsb) . chr($msb);
    return $word;
} 
Run Code Online (Sandbox Code Playgroud)

为了怜悯,请不要使用这个代码!它来自我不知道更好的时候.

可能有人认为我仍然没有,但它在这里再现,表明你可以控制字节的顺序,即使是用脑死亡的方法,因为我需要'f up up.

更好的方法是使用pack亚当Batkin建议.

我想我在Perl 4中犯下了暴行.这是很久以前的事了.我希望我能忘记它......