Преобразование двоичного файла в читаемый текстовый файл в C Linux

#c #file #binary

#c #файл #двоичный

Вопрос:

Мне был предоставлен двоичный файл, который мне нужно преобразовать в читаемый текстовый файл, используя C и Linux. Приведенный ниже код был частично взят с этого сайта.

Я попробовал несколько найденных алгоритмов, но, похоже, ни один из них не работает.

 unsigned char buffer[1000];
FILE *input;
FILE *output;
int n = 0;
int count = 0;

input = fopen("memdb","rb");
output = fopen("output.out","wb");

while(!feof(input))
{
    n = fread(buffer,1,1000,input);

    count  = n;

    fwrite(buffer,1,n,output);
}

fclose(input);
fclose(output);
  

Комментарии:

1. Кое-что, о чем я забыл упомянуть. Код скомпилируется и создаст файл output.out. Однако он будет называться файлом общей библиотеки и не будет доступен для просмотра. Я немного новичок в Linux, поэтому я не уверен точно, что делать.

2. «Я попробовал несколько алгоритмов» -> опубликуйте код одного из тех алгоритмов, которые вы пытались использовать, чтобы повысить достоверность этого вопроса.

Ответ №1:

Ваш код выполняет точную копию двоичного содержимого memdb в output.out. Преобразование в читаемый текст вообще отсутствует. Обратите внимание, что while(!feof(input)) это неправильный способ проверки конца файла, но в вашем конкретном случае это не представляет проблемы.

Ваша цель неясна:

  • что вы подразумеваете под читаемым текстовым файлом?
  • какие данные содержит memdb?
  • вы хотите преобразовать данные, отличные от ASCII, в какую-либо альтернативную форму, более читаемую человеком?

Вот альтернатива, которая создает шестнадцатеричный дамп:

 /* copy binary file memdb as hex, returns the number of bytes or negative for error */
int copy_memdb(void) {
    FILE *input;
    FILE *output;
    int c, count;

    input = fopen("memdb", "rb");
    if (input == NULL) {
        return -1;
    }
    output = fopen("output.out", "w");
    if (output == NULL) {
        fclose(input);
        return -2;
    }
    count = 0;
    while ((c = getc(input)) != EOF) {
        if (count   % 16 == 0) {
            putc('n', output);
        } else {
            putc(' ', output);
        }
        fprintf(%02X", c);
    }
    if (count > 0)
        putc('n', output);

    fclose(input);
    fclose(output);
    return count;
}