我需要从二进制文件中读取32位指令。所以我现在拥有的是:
unsigned char buffer[4];
fread(buffer,sizeof(buffer),1,file);,它将在数组中放置4个字节。
为了以后处理32位指令,我应该如何将这4个字节连接在一起?或者我是否应该以另一种方式开始,而不使用fread?
我现在的奇怪方法是创建一个大小为32的it数组,并使用缓冲区数组中的位填充它。
发布于 2014-05-28 19:31:13
答案取决于32位整数如何存储在二进制文件中。(我假设整数是无符号的,因为它实际上是一个id,并使用来自<stdint.h>的<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的倍数移动或用现有的值来生成整数。评论的草图是如何工作的。大写字母正在读,小写字母已经在那里了。零尚未分配。
大端字节顺序数据存储为四个字节,最小的字节为最后一个字节:
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。
发布于 2014-05-28 19:17:33
添加
unsigned int instruction;
memcpy(&instruction,buffer,4);你的密码。这将把缓冲区的4个字节复制到一个32位变量中.因此,您将得到连接的4个字节:)
发布于 2014-05-28 19:23:50
如果您知道文件中的int与程序正在运行的机器相同,那么您可以直接读取到int中。不需要煤焦缓冲器。
unsigned int instruction;
fread(&instruction,sizeof(instruction),1,file);如果您知道文件中int的特性,但不知道程序正在运行的机器,那么您需要将字节相加并移动到一起。
unsigned char buffer[4];
unsigned int instruction;
fread(buffer,sizeof(buffer),1,file);
//big-endian
instruction = (buffer[0]<<24) + (buffer[1]<<16) + (buffer[2]<<8) + buffer[3];
//little-endian
instruction = (buffer[3]<<24) + (buffer[2]<<16) + (buffer[1]<<8) + buffer[0];另一种思考方法是,它是一个基256中的位置数字系统。就像你把数字组合在一个基数-10上一样。
257
= 2*100 + 5*10 + 7
= 2*10^2 + 5*10^1 + 7*10^0所以你也可以用霍纳的规则把它们组合起来。
//big-endian
instruction = ((((buffer[0]*256) + buffer[1]*256) + buffer[2]*256) + buffer[3]);
//little-endian
instruction = ((((buffer[3]*256) + buffer[2]*256) + buffer[1]*256) + buffer[0]);https://stackoverflow.com/questions/23919953
复制相似问题