为什么Fread以相反的顺序读取unsigned-int?

时间:2019-02-24 20:51:31

标签: c binary

我的二进制文件包含

0400 0000 0000 0000 0400 0000 0000 0000

当我使用以下代码读取无符号整数inputInteger的前4个字节时

FILE *inputFile;
inputFile = fopen("./Debug/rnd_2", "rb");
unsigned int inputInteger = 0;
fread(&inputInteger, sizeof(unsigned int), 1, inputFile);
fclose(inputFile);
exit(0);

我得到的是inputInteger == 4。考虑到位位置为00000100 00000000,它应该不是1024吗?

我的理解是前四个字节为0400 0000

编辑:代码和问题的措辞

1 个答案:

答案 0 :(得分:2)

fread 按顺序读取字符并将它们按相同的顺序放在目标位置,因此对于同一文件,当您考虑回头字符时,小端和大端的结果将是不同的结果为 int

完全像是您

char * p = (char *) &number;

p[0] = fgetc(file);
p[1] = fgetc(file);
...
p[sizeof(int) - 1] = fgetc(file);

(假设文件中有足够的字符)

  

结果读出的数字是4。位0000 0100 0000 0000 == 1024吗?

取决于您的字节序是大还是小,是1024还是64


问题编辑后更新

  

我的二进制文件包含

     

0400 0000 0000 0000 0400 0000 0000 00000000 0000 0000

那一次,您似乎用十六进制值(而不是以前的基数2),所以您的文件包含

  

04 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00

一个字符在8位上,而不是16位上

  • 如果32位上的小端序给出4 +(0 << 8)+(0 << 16)+(0 << 24)= 4

  • 如果在32位上使用大端,则得出(4 << 24)+(0 << 16)+(0 << 8)+ 0 = 16384