从C语言中具有机器代码形式的文本文件中读取字节?

时间:2010-04-27 18:32:36

标签: c text-files

我有一个包含此格式机器代码的文本文件:
B2 0A 05
B2 1A 01
B3 08 00 17
B2 09 18

指令具有以下格式:
OP模式操作数

注意:操作数可以是1或2个字节。

其中:(示例)
OP = B2
模式= 0A
操作数= 05

如何读取变量中的字节?如上例所示。 当我读取文件时,我会得到个别字符。我有一个指针数组,我在那里阅读单独的行,但仍然无法解决读取字节的问题。

任何想法,建议。

我希望我不会在这里混淆任何人。

谢谢。

2 个答案:

答案 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(),它返回下一个数据字节(并在必要时重新加载缓冲区)。