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 和当今大多数其他常见架构是所谓的little-endian,Sparc 架构是big-endian

假设我们有0x1234一个 CPU 寄存器中的值,我们想将它存储在内存中(或者在硬盘驱动器上,在哪里都没有关系)。让N我们要写入的内存地址。我们需要将这个 16 位整数作为两个字节存储在内存中,这是令人困惑的部分:

使用大端机器将存储0x12在 addressN0x34at address N+1。小端机器将存储0x34在 addressN0x12at address N+1。如果我们使用小端机器存储一个值并使用大端机器将其读回,我们将交换两个字节,您将得到您所看到的问题。

于 2012-11-08T14:25:35.710 回答
1

可能是因为两个平台之间的结构包装不同。从外部媒体直接读取结构(作为单元)是一个坏主意,因为这样的问题往往会弹出。

于 2012-11-08T14:23:11.037 回答