首页 > 解决方案 > 为什么 Fread 以相反的顺序读取 unsigned-int?

问题描述

我的二进制文件包含

0400 0000 0000 0000 0400 0000 0000 0000

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

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。考虑到位位置,它不应该是 102400000100 00000000吗?

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

编辑:代码和问题的措辞

标签: cbinary

解决方案


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

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

  • 如果 32 位上的 little endian 给出 4 + (0<<8) + (0<<16) + (0<<24) = 4

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


推荐阅读