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多一点信息.
dao*_*oad 10
您可以使用它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 );
Run Code Online (Sandbox Code Playgroud)
在这个例子中,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;
}
Run Code Online (Sandbox Code Playgroud)
为了怜悯,请不要使用这个代码!它来自我不知道更好的时候.
可能有人认为我仍然没有,但它在这里再现,表明你可以控制字节的顺序,即使是用脑死亡的方法,因为我需要'f up up.
更好的方法是使用pack如亚当Batkin建议.
我想我在Perl 4中犯下了暴行.这是很久以前的事了.我希望我能忘记它......