gpt4 book ai didi

c - 从 C 中的二进制文件中获取 32 位指令

转载 作者:太空宇宙 更新时间:2023-11-04 02:49:13 24 4
gpt4 key购买 nike

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

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

这会将 4 个字节放入一个数组中

我应该如何处理将这 4 个字节连接在一起以便稍后处理 32 位指令?或者我什至应该以不同的方式开始而不使用 fread?

我现在的奇怪方法是创建一个大小为 32 的整数数组,并用缓冲区数组中的位填充它

最佳答案

答案取决于 32 位整数在二进制文件中的存储方式。 (我假设整数是无符号的,因为它实际上是一个 id,并使用 uint32_t 中的类型 <stdint.h>。)

native 字节顺序 数据在此机器上以整数形式写出。只需用 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读取一个 char 并返回一个 0 到 255 之间的整数。(流用完并且 getc 返回负值 EOF 的情况为了简洁,这里不考虑,即懒惰。)通过移动每个字节来构建你的整数读取 8 的倍数和/或它们与现有值。评论概述了它是如何工作的。正在阅读大写字母,小写字母已经在那里。尚未分配零。

大端字节顺序 数据存储为四个字节,最低有效字节最后:

uint32_t op = 0u;

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

基本原理:与上面几乎相同,只是您以另一种顺序移动字节。

您可以将小端法和大端法想象成将数字 120 树 (CXXIII) 写为 321 或 123。移位类似于在除以或乘以 10 的幂时移位十进制数,只是你将我的 8 位移动到这里与 2^8 = 256 相乘。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com