如何使用Perl将指定格式的数据写入二进制文件?
这可能是一个相当新的问题,但我需要处理某个文本文件并将其内容转储到二进制文件中,我不知道如何处理—我决定使用perl,但我的perl技能相当低。我可能应该用C++编写这个,但这似乎是Perl的一个简单而简单的任务,为什么不学习一些新的东西呢?该文本文件有数千行,格式如下:如何使用Perl将指定格式的数据写入二进制文件?,perl,file-io,binary,hex,Perl,File Io,Binary,Hex,这可能是一个相当新的问题,但我需要处理某个文本文件并将其内容转储到二进制文件中,我不知道如何处理—我决定使用perl,但我的perl技能相当低。我可能应该用C++编写这个,但这似乎是Perl的一个简单而简单的任务,为什么不学习一些新的东西呢?该文本文件有数千行,格式如下: 2A02FC42 4 您可以将其视为十六进制数(长度始终为8)和正则数。现在我需要以这种格式将所有行转储到二进制文件中(使用十六进制编辑器查看时应该是这样的): 42FC022A000000004 更多示例,以便更清楚地了解:
2A02FC42 4
您可以将其视为十六进制数(长度始终为8)和正则数。现在我需要以这种格式将所有行转储到二进制文件中(使用十六进制编辑器查看时应该是这样的):
42FC022A000000004
更多示例,以便更清楚地了解:
70726F67 36
->676F727000000024
6A656374471
->7463656A000001D7
解析输入文件的部分很简单,但我仍停留在第二部分,我应该将其写入二进制文件。我不知道如何以这种方式格式化数据,甚至不知道如何以二进制模式输出数据。有人能帮我吗 谢谢
编辑:更新了示例,忘记了LE系统上的endiannes-im。标准方法是使用
pack
。假设从文本文件中读取的数据已经转换为数字(包括十六进制数字),并存储在vars$x
和$y
中。那么你应该做一些类似的事情
print OUTFILE pack("NN", $x, $y);
如果需要不同的字节顺序,则必须使用
与NN
不同的模板,有关详细信息,请参见perldoc-f pack
。使用:
#/usr/bin/perl
使用警告;
严格使用;
#仅演示
*ARGV=*数据;
而(){
我的($a,$b)=拆分;
$a=加入“”,反向$a=~/(..)/g;
$b=sprintf“%08x”,$b;
打印包“H*”=>$a.$b;
}
__资料__
2A02FC42 4
70726F67 36
6A656374 471
样本运行:
$ ./prog.pl | od -t x1
0000000 42 fc 02 2a 00 00 00 04 67 6f 72 70 00 00 00 24
0000020 74 63 65 6a 00 00 01 d7
0000030
$./prog.pl | od-t x1
0000000 42 fc 02 2a 00 00 04 67 6f 72 70 00 00 24
0000020 74 63 65 6a 00 00 01 d7
0000030My版本(已测试):
注意:为了获得最佳的可移植性,您应该为输出流切换二进制模式:
binmode(STD0UT)
$ ./prog.pl | od -t x1
0000000 42 fc 02 2a 00 00 00 04 67 6f 72 70 00 00 00 24
0000020 74 63 65 6a 00 00 01 d7
0000030
my $fout;
if ( ! open( $fout, ">/tmp/deleteme.bin" ) ) {
die( "Failed to open /tmp/deleteme.bin: $!" );
}
binmode( $fout );
while ( <DATA> ) {
my ( $left, $right ) = split( /\s+/s, $_ );
my $output = pack( "VN", hex($left), int($right) );
printf(
STDERR
" note, %8X %d -> " . ( "%02X" x 8 ) . "\n",
hex($left), $right,
map { $_ } unpack( "C8", $output )
);
print( $fout $output );
}
close( $fout );
__DATA__
70726F67 36 -> 676F727000000024
6A656374 471 -> 7463656A000001D7
note, 70726F67 36 -> 676F727000000024
note, 6A656374 471 -> 7463656A000001D7