Получение файла в шестнадцатеричном формате - вывод вывода на вывод xxd

Я пытаюсь написать простую программу для генерации шестнадцатеричного вывода из файла. Это мой файл two.c:

#include <stdio.h>
int
main(void) { printf("%s\n", "Hello"); return 0;
}
</stdio.h>

который был составлен таким образом:

gcc -std=c99 -Wall -Wextra -pedantic-errors two.c -o two

поэтому у меня есть two исполняемых файла.

Теперь я написал программу, чтобы прочитать этот файл и показать его двоичный (шестнадцатеричный) вывод. Это моя программа:

#include <stdio.h>
int
fileSize(FILE *ptr) { int size = 0; fseek(ptr, 0, SEEK_END); size = ftell(ptr); fseek(ptr, 0, SEEK_SET); return size;
}
int
main(void) { FILE *fp; fp = fopen("two", "rb"); int sz = fileSize(fp); char buff[ sz ]; if (!fp) printf("%s\n", "Not great at all"); else while (!feof(fp)) { fgets(buff, sz, fp); for (int i = 0; i < sz; i++) { printf("%02x%02x ", (buff[i] & 0xFF), (buff[i+1] & 0xFF)); if (!(i % 8)) printf("\n"); } printf("\n"); } fclose(fp);
}
</stdio.h>

И вот огромный выход из этого http://pastebin.com/RVLy6H9B

Проблема в том, что когда я использую команду linux xxd two > two.hex я получаю совершенно другой вывод (это не форматирование), и есть только около 500 строк байтов, а не примерно 8k, как в моем выпуске.

Выход xxd: http://pastebin.com/Gw9wg93g

В чем проблема? Что-то не так с функцией чтения fgets(buff, sz, fp); ?

1 ответ

fgets() перестает читать после EOF или новой строки. Но ваш код всегда циклы sz раз.

fgets() не является правильной функцией для чтения двоичных данных. Вместо этого вы можете использовать fread().

licensed under cc by-sa 3.0 with attribution.