我需要从二进制文件中读取32位指令。
所以我现在拥有的是:

unsigned char buffer[4];
fread(buffer,sizeof(buffer),1,file);

它将在一个数组中放入4个字节
为了以后处理32位指令,我应该如何将这4个字节连接在一起?
或者我应该换一种方式开始而不使用fread?
我现在奇怪的方法是创建一个大小为32的整数数组,并用缓冲区数组中的位填充它

最佳答案

答案取决于32位整数如何存储在二进制文件中。(我假设整数是无符号的,因为它实际上是一个id,并使用uint32_tfrom<stdint.h>类型)
本机字节顺序数据在此计算机上以整数形式写出。只需用fread读取整数:

uint32_t op;

fread(&op, sizeof(op), 1, file);

理由:fread将整数的原始表示读入内存。匹配的fwrite执行相反的操作:它将原始表示写入thze文件。如果不需要在平台之间交换文件,这是存储和读取数据的好方法。
小端字节顺序数据存储为四个字节,最低有效字节优先:
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和它们与现有值的移位来构建整数。评论勾勒出了它的工作原理。大写字母正在读,小写字母已经在那儿了。尚未分配零。
Big endian字节顺序数据存储为四个字节,最后是最低有效字节:
uint32_t op = 0u;

op |= getc(file) << 24;      // 0xAA000000
op |= getc(file) << 16;      // 0xaaBB0000
op |= getc(file) << 8;       // 0xaabbCC00
op |= getc(file);            // 0xaabbccDD

理由:与上述基本相同,只是您按另一个顺序移动字节。
你可以想象,小endian和大endian将120号树(CXXIII)写成321或123。位移位类似于用10的幂除或乘时的小数位数移位,只是在这里您将我的8位移位为乘2^8=256。

关于c - 从C中的二进制文件中获取32位指令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23919953/

10-11 15:25
查看更多