答案取决于 32 位整数在二进制文件中的存储方式。 (我假设整数是无符号的,因为它确实是一个 id,并使用来自 <stdint.h> 的类型 uint32_t。)
本机字节顺序 数据在本机上以整数形式写入。只需使用fread 读取整数:
uint32_t op;
fread(&op, sizeof(op), 1, file);
基本原理:fread 将整数的原始表示读入内存。匹配的 fwrite 则相反:它将原始表示写入 thze 文件。如果您不需要在平台之间交换文件,这是存储和读取数据的好方法。
Little-endian 字节顺序 数据存储为四个字节,最低有效字节在前:
uint32_t op = 0u;
op |= getc(file); // 0x000000AA
op |= getc(file) << 8; // 0x0000BBaa
op |= getc(file) << 16; // 0x00CCbbaa
op |= getc(file) << 24; // 0xDDccbbaa
基本原理:getc 读取一个字符并返回一个介于 0 和 255 之间的整数。(为简洁起见,此处不考虑流用完且 getc 返回负值 EOF 的情况,即懒惰。)通过将读取的每个字节移动 8 的倍数或将它们与现有值一起移动来构建整数。 cmets 勾勒出它是如何工作的。正在读取大写字母,小写字母已经存在。尚未分配零。
大端字节序 数据存储为四个字节,最低有效字节在后:
uint32_t op = 0u;
op |= getc(file) << 24; // 0xAA000000
op |= getc(file) << 16; // 0xaaBB0000
op |= getc(file) << 8; // 0xaabbCC00
op |= getc(file); // 0xaabbccDD
基本原理:与上面几乎相同,只是您以另一种顺序移动字节。
您可以将 little-endian 和 big-endian 想象为将数字 120 树 (CXXIII) 写为 321 或 123。位移类似于在除以或乘以 10 的幂时移动十进制数字, 只是你把我的 8 位移到这里乘以 2^8 = 256。