繁体   English   中英

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

[英]How can I create a binary file in Perl?

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

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

Perl pack函数将根据模板返回“二进制”数据。

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

在上面的例子中, 's'告诉它输出一个short (16位), '<'强制它输出little-endian模式。

另外, open的调用中的':raw'告诉它将文件句柄放在重要的平台上的二进制模式(相当于使用binmode )。 PerlIO手册页提供了有关以不同格式进行I / O的更多信息。

您可以使用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路线,请查看包装教程 ,它有助于澄清有些神秘的包装文档。

是的,使用binmode

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

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

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

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

Adam Batkin建议,更好的方法是使用pack

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM