Получение файла в шестнадцатеричном формате - мой вывод против вывода команды 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() вместо.

Другие вопросы по тегам