1

fread を使用してファイルの最初のバイトを読み込んでいます。

fread(&example_struct, sizeof(example_struct), 1, fp_input);

Linux と Solaris で結果が異なるのはどれですか? example_struct (Elf32_Ehdr) は、elf.h で定義されている標準 GNU C ライブラリの一部ですか? なぜこれが起こるのか教えていただければ幸いです。

一般的な構造体は次のようになります。

typedef struct
{
  unsigned char e_ident[LENGTH];    
  TYPE_Half e_type;         
} example_struct;

デバッグコード:

for(i=0;paul<sizeof(example_struct);i++){
    printf("example_struct->e_ident[%i]:(%x) \n",i,example_struct.e_ident[i]);
}
printf("example_struct->e_type: (%x) \n",example_struct.e_type);
printf("example_struct->e_machine: (%x) \n",example_struct.e_machine);

Solaris の出力:

Elf32_Ehead->e_ident[0]: (7f) 
Elf32_Ehead->e_ident[1]: (45) 
...
Elf32_Ehead->e_ident[16]: (2) 
Elf32_Ehead->e_ident[17]: (0)
...
Elf32_Ehead->e_type: (200) 
Elf32_Ehead->e_machine: (6900) 

Linux 出力:

Elf32_Ehead->e_ident[0]: (7f) 
Elf32_Ehead->e_ident[1]: (45) 
...
Elf32_Ehead->e_ident[16]: (2) 
Elf32_Ehead->e_ident[17]: (0)
...
Elf32_Ehead->e_type: (2) 
Elf32_Ehead->e_machine: (69)

おそらく次のようになります: http://forums.devarticles.com/cc-help-52/file-io-linux-and-solaris-108308.html

4

2 に答える 2

5

マシンに搭載されている CPU、おそらく Solaris マシンの Sparc64 と Linux ボックスの x86_64 については言及していませんが、エンディアンの問題があると思います。現在、Intel、ARM、およびその他の最も一般的なアーキテクチャはリトルエンディアンとして知られているものであり、Sparc アーキテクチャはビッグエンディアンです。

CPU レジスタに値0x1234があり、それをメモリ (またはハード ドライブ、場所は問わない) に格納するとします。を書き込みNたいメモリアドレスにします。この 16 ビット整数を 2 バイトとしてメモリに格納する必要があります。ここで紛らわしい部分があります。

ビッグ エンディアン マシンを使用すると0x12、 addressNおよびaddress に格納さ0x34れますN+1。リトルエンディアン マシンは0x34、 addressNおよびaddress に格納さ0x12れますN+1。リトル エンディアン マシンを使用して値を格納し、ビッグ エンディアン マシンを使用してそれを読み取ると、2 バイトが交換され、表示されている問題が発生します。

于 2012-11-08T14:25:35.710 に答える
1

おそらく、2 つのプラットフォーム間の構造パッキングの違いが原因です。このような問題が発生する傾向があるため、外部メディアから構造を (ユニットとして) 直接読み取ることはお勧めできません。

于 2012-11-08T14:23:11.037 に答える