我有一个包含此格式机器代码的文本文件:
B2 0A 05
B2 1A 01
B3 08 00 17
B2 09 18
指令具有以下格式:
OP模式操作数
注意:操作数可以是1或2个字节。
其中:(示例)
OP = B2
模式= 0A
操作数= 05
如何读取变量中的字节?如上例所示。 当我读取文件时,我会得到个别字符。我有一个指针数组,我在那里阅读单独的行,但仍然无法解决读取字节的问题。
任何想法,建议。
我希望我不会在这里混淆任何人。
谢谢。
答案 0 :(得分:3)
考虑使用fscanf
。您可以使用%x
格式说明符来读取十六进制整数。
答案 1 :(得分:0)
验证文件是以二进制模式打开的(“rb”)。
使用fread
一次读取一个字节:
unsigned char opcode;
unsigned char mode;
unsigned int operand;
fread(&opcode, 1, sizeof(opcode), data_file);
fread(&mode, 1, sizeof(mode), data_file);
// Use mode and opcode to determine how many bytes to read
if (opcode == 0xB2)
{
unsigned char byte_operand = 0;
fread(&byte_operand, 1, sizeof(byte_operand), data_file);
operand = byte_operand;
}
if (opcode == 0xB3)
{
if (mode == 0x08)
{
fread(&operand, 1, sizeof(operand), data_file);
}
}
更有效的方法是将块或块的数据读入缓冲区,并使用指向const unsigned char
的指针解析缓冲区:
unsigned char * buffer = malloc(MAX_BUFFER_SIZE);
unsigned char * p_next_byte = 0;
if (buffer)
{
fread(buffer, MAX_BUFFER_SIZE, sizeof(unsigned char), data_file);
p_next_byte = buffer;
opcode = *p_next_byte++;
mode = *p_next_byte++
Get_Operand(&operand,
&p_next_byte,
opcode,
mode);
}
更安全的设计是使用函数Get_Byte()
,它返回下一个数据字节(并在必要时重新加载缓冲区)。