我正在读取一个文件,其中包含使用“33441122”字节顺序的整数。如何将文件转换为“11223344”(大端)字节顺序?我尝试了几件事,但我真的迷路了。
我已经阅读了很多关于 Perl 的内容,但是当谈到交换字节时,我一无所知。我怎样才能转换这个:
33 44 11 22
进入这个:
11 22 33 44
使用 Perl。
任何投入将不胜感激 :)
我正在读取一个文件,其中包含使用“33441122”字节顺序的整数。如何将文件转换为“11223344”(大端)字节顺序?我尝试了几件事,但我真的迷路了。
我已经阅读了很多关于 Perl 的内容,但是当谈到交换字节时,我一无所知。我怎样才能转换这个:
33 44 11 22
进入这个:
11 22 33 44
使用 Perl。
任何投入将不胜感激 :)
您可以一次读取 4 个字节,将其拆分为单独的字节,交换它们并再次写出
#! /usr/bin/perl
use strict;
use warnings;
open(my $fin, '<', $ARGV[0]) or die "Cannot open $ARGV[0]: $!";
binmode($fin);
open(my $fout, '>', $ARGV[1]) or die "Cannot create $ARGV[1]: $!";
binmode($fout);
my $hexin;
my $n;
while (($n = read($fin, $bytes_in, 4)) == 4) {
my @c = split('', $bytes_in);
my $bytes_out = join('', $c[2], $c[3], $c[0], $c[1]);
print $fout $bytes_out;
}
if ($n > 0) {
print $fout $bytes_in;
}
close($fout);
close($fin);
这将在命令行上调用为
perl script.pl infile.bin outfile.bin
outfile.bin
将被覆盖。
我认为最好的方法是一次读取两个字节并在输出它们之前对其进行 dwap。
该程序创建一个数据文件test.bin
,然后将其读入,如所述交换字节。
use strict;
use warnings;
use autodie;
open my $fh, '>:raw', 'test.bin';
print $fh "\x34\x12\x78\x56";
open my $out, '>:raw', 'new.bin';
open $fh, '<:raw', 'test.bin';
while (my $n = read $fh, my $buff, 2) {
$buff = reverse $buff if $n == 2;
print $out $buff;
}