0

自分の構造の何が悪いのか理解できません。

ネストされたPNGヘッドのデータの非常に基本的な構造は次のとおりです。

typedef struct _chunk Chunk;
typedef struct _file_header file_header;


#pragma pack(push, 1)

struct _chunk
{
    unsigned int size;
    unsigned char type[4];
};

struct _file_header
{
    unsigned char signature[8];
    Chunk ihdr;
};

#pragma pack(pop)

これがメインプログラムのスニペットです:

int main ()
{
    FILE* img;
    file_header* h;

    if ((img=fopen("flower.png", "rb")) == NULL) {
        printf("file not found.\n");
        exit(1);
    }


    h = (file_header*)malloc(sizeof(file_header));
    fread(h, sizeof(char), sizeof(file_header), img);

    // the ouput from the printf below should be "13"
    // but what it shows is "218103808" !! (?)
    printf("%i\n", h->ihdr.size);

    free(h);
    fclose(img);
    return 0;
}

誰かが私にこの構造の何が悪いのか説明してもらえますか、あるいは何も問題がなければ、物事をうまく機能させるために何を変えるべきですか?

4

1 に答える 1

3

バイトオーダー。

ディスクからバイトを読み取り、00 00 00 0Dそれらをローエンディアン整数に直接詰め込みました。ここで、バイトは0 + 256 * 0 + 65536 * 0 + 16777216 * 13=218103808として解釈されます。

おそらくあなたがすべきことは、データをフレッドした後、整数をビッグエンディアンからマシンフォーマットに変換することです。または、ユーティリティ関数を記述して、ファイルポインタ(またはファイル記述子)から関連データを読み取り、個々のデータ型固有のリーダーを呼び出して構造体にデータを入力する専用の「PNG関数のロード」を記述します。

于 2012-10-24T15:20:11.593 に答える