7

バイナリ ファイルを一度に 1 バイトずつ読み取り、各バイトを処理し、処理された値に応じて何らかのアクションを実行する必要があるツールを作成しています。しかし、何らかの理由で、Perl が取得する値はファイル内のデータと同じではありません。私はこれに似たコードを使用しています(簡潔にするために削除されていますが、これでも問題が発生します):

#!/usr/bin/perl
use strict;

my $bytesToProcess = 16;
my $fileName = 'datafile.bin';

print "Processing $bytesToProcess bytes...\n";

open FILE, "<:raw", $fileName or die "Couldn't open $fileName!";

for my $offset (0 .. $bytesToProcess - 1)
{
    my $oneByte;
    read(FILE, $oneByte, 1) or die "Error reading $fileName!";
    printf "0x%04X\t0x%02X\n", $offset, $oneByte;
}

close FILE;

入力値 (データ ファイルの最初の 16 バイト):50 53 4D 46 30 30 31 35 00 00 70 00 07 3F 10 00

出力:

Processing 16 bytes...
0x0000  0x00
0x0001  0x00
0x0002  0x00
0x0003  0x00
0x0004  0x00
0x0005  0x00
0x0006  0x01
0x0007  0x05
0x0008  0x00
0x0009  0x00
0x000A  0x00
0x000B  0x00
0x000C  0x00
0x000D  0x00
0x000E  0x00
0x000F  0x00

ここで何がうまくいかないのですか?

4

1 に答える 1

9

read"\x50"number ではなくchar としてバイトを返します0x50printf行を次のように変更します

printf "0x%04X\t0x%02X\n", $offset, ord $oneByte;

別のオプションは、を使用することunpack 'c', $oneByteです。

于 2012-11-02T08:19:26.223 に答える