我在用fread读取文件的第一个字节:

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

在linux和solaris下,哪一个结果不同?因此示例结构(elf32)是elf.h中定义的standart gnu c liborary的一部分?我很高兴知道为什么会这样?
常规结构如下所示:
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/c-c-help-52/file-io-linux-and-solaris-108308.html

最佳答案

您没有提到计算机中有什么CPU,可能是solaris机器中的sparc64和linux机器中的x86_64,但我猜您有一个endianness问题。intel、arm和当今最常见的体系结构是所谓的小endian,sparc体系结构是big endian。
假设值0x1234在一个cpu寄存器中,我们想把它存储在内存中(或者硬盘上,不管在哪里)。设N为要写入的内存地址。我们需要将这个16位整数存储为内存中的两个字节,下面是令人困惑的部分:
使用大端机将0x12存储在地址N处,而0x34存储在地址N+1处。
一个小型的endian机器将0x34存储在地址N处,而0x12存储在地址N+1处。
如果我们使用一个小的endian机器存储一个值,然后使用一个大的endian机器读取它,我们将交换两个字节,您将得到您看到的问题。

关于c - 在solaris和linux下读取结构差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13290712/

10-11 20:57