c - 为什么 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
编辑:代码和问题的措辞
解决方案
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
推荐阅读
- algorithm - 将多属性项目分组到属性桶,以便桶大小相同
- asp.net-mvc-5 - Azure AD B2C 要求用户在用户关闭并重新打开 Internet Explorer 10 浏览器后再次登录 - Chrome 运行良好
- android - 错误:不兼容的类型:对象无法转换为 LocalDate
- foreach - VBS 附加 Word 文档
- python - 如何使用 Python 和 BeautifulSoup 从 Indeed 获取完整的职位描述
- reactjs - 在提交表单期间抛出对象作为 React 子项无效
- web - 执行 GET 请求时出错(未处理:GET)
- mule - Mule 4:读取 CSV 文件时出错,输入格式错误
- ios - iOS 中并不总是遵循打印选项“双面”
- nginx - 在 centOS 中使用 ssl 保护 tileserver-gl