3

この問題は解決されました。本当にありがとうございました^^

私の問題と私が使用している解決策を以下に示します。

元の問題: --- 2013-05-08 編集

次のように C++ でこのタスクを実行できることを知っています。

struct {              /* File Header */
    int a;
    int b;
    short c;    
    short d;
} PPPhdr;
PPPhdr head;
fstream fst;
fst.open("file.txt", ios_base::in|ios_base::binary);
fst.read((char*)&head, sizeof(PPPhdr));
SwapInt32(&(head.a));
SwapInt32(&(head.b));
SwapShort(&(head.c));
SwapShort(&(head.d));

したがって、基本的に SwapInt32 はこれを行います。

0x89346512 -> 0x12653489

SwapShort はこれを行います。

0x3487 -> 0x8734

私の質問は、Perl でこれを行うにはどうすればよいですか?

私のやり方:

open FH, "<file.txt" or die print "Cannot open file\n";
binmode FH;
read FH, $temp, 12;
($a,$b) = unpack("N2", substr($temp,0,8));
($c,$d) = unpack("n2", substr($temp,8,4));
close(FH);
print "$a\n$b\n$c\n$d\n";
4

4 に答える 4

2

Perl には、符号付きビッグ エンディアン整数の単一文字形式がありません。そのために使用pack 'i>'します。(これには少なくとも Perl 5.10 が必要です。)

于 2013-05-07T15:43:53.680 に答える
2

データはビッグエンディアンだと言いますがi、unpack 呼び出しでテンプレート (符号付き整数値) を使用しています。N(符号なしの 32 ビット ビッグ エンディアン番号)を使用する必要があります。ドキュメントを読むことをお勧めします。

于 2013-05-07T15:41:30.623 に答える
1

パックして、逆にアンパックする必要があります。

print "ok\n" if 0x12653489 == unpack 'L', pack 'N', 0x89346512;
于 2013-05-08T01:51:27.257 に答える