C solaris和linux下结构差异的fread

C solaris和linux下结构差异的fread,c,linux,solaris,fread,C,Linux,Solaris,Fread,我正在用fread读取文件的第一个字节: fread(&example_struct, sizeof(example_struct), 1, fp_input); 在linux和solaris下,哪种结果会不同?其中示例结构(Elf32_Ehdr)是elf.h中定义的标准GNU C库的一部分?我很高兴知道为什么会这样 常规结构如下所示: typedef struct { unsigned char e_ident[LENGTH]; TYPE_Half e_type;

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

fread(&example_struct, sizeof(example_struct), 1, fp_input);
在linux和solaris下,哪种结果会不同?其中示例结构(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);
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)

可能类似于:

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

可能是因为两个平台之间的结构打包不同。直接从外部介质读取结构(作为单元)是个坏主意,因为这样的问题往往会突然出现。

您没有提到机器中有什么CPU,Solaris机器中可能有Sparc64,Linux机器中可能有x86_64,但我想您可能有一个endianness问题。英特尔、ARM和当今最常见的体系结构是被称为little endian的体系结构,Sparc体系结构是big endian

假设CPU寄存器中有值
0x1234
,我们希望将其存储在内存中(或硬盘上,无论在何处)。让
N
成为我们要写入的内存地址。我们需要将这个16位整数作为两个字节存储在内存中,下面是令人困惑的部分:

使用big-endian机器将
0x12
存储在地址
N
0x34
存储在地址
N+1
。 一台小型endian机器将在地址
N
处存储
0x34
,在地址
N+1
处存储
0x12

如果我们使用小端机存储一个值,然后使用大端机读取它,我们将交换两个字节,您将看到问题。

您没有提到机器中的CPU,可能是Solaris机器中的Sparc64和Linux机器中的x86_64,但我猜你有一个持久性问题。英特尔、ARM和当今最常见的体系结构是被称为little endian的体系结构,Sparc体系结构是big endian

假设CPU寄存器中有值
0x1234
,我们希望将其存储在内存中(或硬盘上,无论在何处)。让
N
成为我们要写入的内存地址。我们需要将这个16位整数作为两个字节存储在内存中,下面是令人困惑的部分:

使用big-endian机器将
0x12
存储在地址
N
0x34
存储在地址
N+1
。 一台小型endian机器将在地址
N
处存储
0x34
,在地址
N+1
处存储
0x12

如果我们使用小端机存储一个值,并使用大端机将其读回,我们将交换两个字节,您将看到问题。

是i386上的Solaris还是sparc上的Solaris?我虽然也有端号问题,但这将假设用另一个操作系统读取一个操作系统的磁盘,不是吗?我也想到了一个持久性问题,但这会假设用另一个操作系统读取一个操作系统的磁盘,不是吗?好的,Solaris在UltraSPARC T2上运行,LinuxBox在正常的x86架构上运行。令人困惑的是,编写文件的软件(不是从我这里)的方式是相同的,但我的读入在两台机器上做了不同的事情所以有没有一种好的方法来编写在两台机器上运行的结构读入,或者我必须检测软件运行的实际系统吗?这个问题有一些很好的答案,包括交换字节顺序的示例C代码:Ok Solaris在UltraSPARC T2上运行,LinuxBox在正常x86架构上运行。令人困惑的是,编写文件的软件(不是从我这里)的方式是相同的,但我的读入在两台机器上做了不同的事情所以有没有一种好的方法来编写在两台机器上运行的结构读入,或者我必须检测软件运行的实际系统吗?这个问题有一些很好的答案,包括用于交换字节顺序的示例C代码:
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)