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 回答