1

「33441122」バイトオーダーを使用して整数を含むファイルを読み取っています。ファイルを「11223344」(ビッグエンディアン)バイトオーダーに変換するにはどうすればよいですか?私はいくつかのことを試みましたが、私は本当に迷っています。

私はPerlについてたくさん読んだことがありますが、バイトの交換に関しては、私は暗闇の中にいます。これを変換するにはどうすればよいですか?

33 44 11 22

これに:

11 22 33 44

Perlを使用します。

任意の入力をいただければ幸いです:)

4

2 に答える 2

3

一度に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上書きされます。

于 2013-01-29T15:49:04.127 に答える
1

一度に2バイトを読み取り、出力する前にそれらを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;
}
于 2013-01-29T20:14:12.913 に答える