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

вывод xxd: http://pastebin.com/Gw9wg93g

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


person python    schedule 03.10.2014    source источник
comment
здесь fp = fopen("two", "rb"); какой файл вы открываете two.c или two.o ?   -  person Rustam    schedule 03.10.2014
comment
Я открываю two файл - результат компиляции gcc.   -  person python    schedule 03.10.2014
comment
.... и while (!feof(fp)) неверно   -  person WhozCraig    schedule 03.10.2014


Ответы (1)


fgets() прекращает чтение после EOF или перехода на новую строку. Но ваш код всегда зацикливается sz раза.

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

person jfs    schedule 03.10.2014
comment
@python: также вам не нужно читать весь файл сразу. Вы можете прочитать его по BUFSIZ байту за раз. - person jfs; 03.10.2014
comment
Да, я знаю. Я просто хотел посмотреть, как вообще работает чтение :) - person python; 03.10.2014