我需要从二进制文件中读取32位指令。
所以我现在拥有的是:
unsigned char buffer[4];
fread(buffer,sizeof(buffer),1,file);
它将在一个数组中放入4个字节
为了以后处理32位指令,我应该如何将这4个字节连接在一起?
或者我应该换一种方式开始而不使用fread?
我现在奇怪的方法是创建一个大小为32的整数数组,并用缓冲区数组中的位填充它
最佳答案
答案取决于32位整数如何存储在二进制文件中。(我假设整数是无符号的,因为它实际上是一个id,并使用uint32_t
from<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/