Убедитесь, что файл открыт в двоичном режиме («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()
, которая возвращает следующий байт данных (и при необходимости перезагружает буферы).