Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl将指定格式的数据写入二进制文件?_Perl_File Io_Binary_Hex - Fatal编程技术网

如何使用Perl将指定格式的数据写入二进制文件?

如何使用Perl将指定格式的数据写入二进制文件?,perl,file-io,binary,hex,Perl,File Io,Binary,Hex,这可能是一个相当新的问题,但我需要处理某个文本文件并将其内容转储到二进制文件中,我不知道如何处理—我决定使用perl,但我的perl技能相当低。我可能应该用C++编写这个,但这似乎是Perl的一个简单而简单的任务,为什么不学习一些新的东西呢?该文本文件有数千行,格式如下: 2A02FC42 4 您可以将其视为十六进制数(长度始终为8)和正则数。现在我需要以这种格式将所有行转储到二进制文件中(使用十六进制编辑器查看时应该是这样的): 42FC022A000000004 更多示例,以便更清楚地了解:

这可能是一个相当新的问题,但我需要处理某个文本文件并将其内容转储到二进制文件中,我不知道如何处理—我决定使用perl,但我的perl技能相当低。我可能应该用C++编写这个,但这似乎是Perl的一个简单而简单的任务,为什么不学习一些新的东西呢?该文本文件有数千行,格式如下:

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