Чтение байтов из текстового файла, который имеет форму машинного кода в C? - PullRequest
1 голос
/ 27 апреля 2010

У меня есть текстовый файл с машинным кодом в этой форме:
B2 0A 05
B2 1A 01
B3 08 00 17
B2 09 18

, где инструкция имеет следующий формат:
Операнд режима ОП

Примечание: операнд может быть 1 или 2 байта.

Где: (пример)
OP = B2
Режим = 0A
Операнд = 05

Как я могу прочитать байты в переменной? Как показано в приведенном выше примере. Когда я читаю файл, я получаю отдельные символы. У меня есть массив указателей, где я читаю отдельную строку, но все еще не могу решить проблему чтения байта.

Любые идеи, предложения.

Надеюсь, я никого не путаю здесь.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2010

Рассмотрите возможность использования fscanf. Вы можете использовать спецификатор формата %x для чтения шестнадцатеричных целых чисел.

0 голосов
/ 28 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...