eac*_*tor 1 c linux solaris fread
我正在使用fread读取文件的第一个字节:
fread(&example_struct, sizeof(example_struct), 1, fp_input);
Run Code Online (Sandbox Code Playgroud)
哪个在linux和solaris下结果不同?那么example_struct(Elf32_Ehdr)是elf.h中定义的Standart GNU C Liborary的一部分?我很高兴知道为什么会这样?
一般结构看起来如下:
typedef struct
{
unsigned char e_ident[LENGTH];
TYPE_Half e_type;
} example_struct;
Run Code Online (Sandbox Code Playgroud)
调试代码:
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);
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
也许类似于:http://forums.devarticles.com/cc-help-52/file-io-linux-and-solaris-108308.html
你没有提到机器中的CPU,可能是Solaris机器中的Sparc64和Linux机器中的x86_64,但我猜你有一个字节序问题.英特尔,ARM和当今大多数其他常见架构都称为little-endian,Sparc架构是big-endian.
假设我们0x1234
在CPU寄存器中有值,我们想将它存储在内存中(或者在硬盘驱动器上,无论在哪里).我们N
是我们要写入到内存地址.我们需要将这个16位整数作为两个字节存储在内存中,这里有一个令人困惑的部分:
使用大端机器将存储0x12
在地址N
和0x34
地址N+1
.一个小端机器将存储0x34
在地址N
和0x12
地址N+1
.如果我们使用一个小端机器存储一个值并使用大端机器读回来,我们将交换两个字节,你会得到你所看到的问题.