1

ファイルから16進出力を生成する簡単なプログラムを作成しようとしています。これは私の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実行可能ファイルを持っています。

ここで、そのファイルを読み取り、バイナリ (16 進数) 出力を表示するプログラムを作成しました。これは私のプログラムです:

#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まったく異なる出力が得られ(フォーマットに関するものではありません)、出力のように約8kではなく、約500行のバイトしかないことです。

xxd 出力: http://pastebin.com/Gw9wg93g

問題はどこだ?読み取り機能に問題はありますfgets(buff, sz, fp);か?

4

1 に答える 1

2

fgets()は、EOF または改行の後で読み取りを停止します。しかし、コードは常にループしますsz

fgets()バイナリ データを読み取るための適切な関数ではありません。代わりに使用できますfread()

于 2014-10-03T11:35:45.737 に答える