Ошибка чтения двоичного файла. Это проблема с порядком байтов или проблема с чтением файла? - PullRequest
0 голосов
/ 26 марта 2020

В настоящее время я работаю над запуском простой виртуальной машины c, которая считывает в двоичном файле массив «памяти», а затем извлекает декодирование и оценивает данные инструкции. На данный момент я застрял в том, как правильно читать этот двоичный файл в память, чтобы иметь возможность читать для последующего использования при декодировании и разделении его на 2 или 4 байта. Мой ввод не совпадает с тем, что я получаю для вывода, который я поместил ниже, и я не уверен, является ли это проблемой с порядком байтов или если я неправильно читаю файл в память.

MAIN. c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXMEM 1024

unsigned memory[MAXMEM];

int loads(char *filename)
{
    File *file = fopen(filename, "rb");
    return fread(memory, sizeof *memory, MAXMEM, file);
}

int main(int argc, char **argv){
    if(argc <= 1){
        printf("No file Found\n");
        return -1;
        }
    char *filename = argv[1];
    loads(filename);
    printf("%04x\n", *memory);
}

INPUT.BIN (данные получены из работы od -x --endian=big input.bin | head -5)

00000000 b10a b200 1123

ТЕКУЩИЙ ВЫХОД

b20ab1

ЖЕЛАЕМЫЙ ВЫХОД

either b10a b200 1123 
or b1 0a b2 00 11 23

1 Ответ

1 голос
/ 26 марта 2020

проблема отображения - все в этом утверждении:

printf("%04x\n", *memory);

сначала используйте строку формата, которая представляет формат, который вы хотите отобразить. Возможно:

"%02x %02x %02x $02x\n"

Следующий предложенный код:

  1. безошибочно компилирует
  2. выполняет желаемую функциональность
  3. правильно обрабатывает ошибки ввода-вывода
  4. не включает заголовочные файлы, содержимое которых не используется

И теперь предложенный код:

#include <stdio.h>
//#include <string.h>
#include <stdlib.h>  // exit(), EXIT_FAILURE

#define MAXMEM 1024

char memory[MAXMEM];

size_t loads(char *filename)
{
    FILE *file = fopen(filename, "rb");
    if( !file )
    {
        perror( "fopen for read failed" );
        exit( EXIT_FAILURE );
    }

    return  fread(memory, sizeof *memory, MAXMEM, file);
}

int main(int argc, char **argv){

    if( argc != 2 )
    {
        fprintf( stderr, "USAGE: %s inputFileName\n", argv[0] );
        exit( EXIT_FAILURE );
    }

    char *filename = argv[1];
    size_t fileSize = loads(filename);
    printf( "File Size: %zu\n", fileSize );
    printf("%02x %02x %02x %02x\n", 
           memory[0], 
           memory[1], 
           memory[2], 
           memory[3]);
}

при запуске с тем же исходным файлом приводит к:

File Size: 701
23 69 6e 63

Примечание: 23 69 6e 63 - это шестнадцатеричные значения для #inc

Я изменил память, чтобы иметь тип char. Если вы хотите сохранить его unsigned, обратите внимание, что 32-битный без знака содержит 8 полубайтов, поэтому строка формата вызова printf() должна быть %08x для каждого отображаемого значения без знака

...