#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;
}