Получение файла в шестнадцатеричном формате - мой вывод против вывода команды xxd
Я пытаюсь написать простую программу для генерации шестнадцатеричного вывода из файла. Это мое two.c
файл:
#include <stdio.h>
int
main(void) {
printf("%s\n", "Hello");
return 0;
}
который был составлен таким образом:
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);
}
И вот огромный выход этого http://pastebin.com/RVLy6H9B
Проблема в том, когда я использую команду Linux xxd two > two.hex
Я получаю совершенно другой вывод (дело не в форматировании), и в нем всего около 500 строк байтов, а не около 8 Кб, как в моем выводе.
xxd вывод: http://pastebin.com/Gw9wg93g
В чем проблема? Что-то не так с функцией чтения fgets(buff, sz, fp);
?
1 ответ
fgets()
перестает читать после EOF или новой строки. Но ваш код всегда зацикливается sz
раз.
fgets()
не правильная функция для чтения двоичных данных. Вы могли бы использовать fread()
вместо.