[英]How can I create a binary file in Perl?
例如,我想创建一个名为sample.bin
的文件,并输入一个数字,如255,以便将255保存在文件中作为little-endian,FF 00.或3826到F2 0E。
我尝试使用binmode,正如perldoc所说。
您可以使用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
路线,请查看包装教程 ,它有助于澄清有些神秘的包装文档。
是的,使用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.