fread into struct 读取数据不正确

2024-04-05

我正在尝试将位图 (.bmp) 图像标题读入struct in c.

typedef unsigned short WORD;
typedef unsigned long DWORD;

typedef struct _BITMAPFILEHEADER {
    WORD Type;
    DWORD Size;
    WORD Reserved1;
    WORD Reserved2;
    DWORD OffBits;
} BITMAPFILEHEADER;

我的代码读取位图文件

FILE *fp;
BITMAPFILEHEADER header;

fp = fopen(file,"rb");
if (fp == NULL) {
    printf("cannot open file!\n");
    return 1;
}

fread(&header, sizeof(BITMAPFILEHEADER), 1, fp);

printf("Type: %02x\n", header.Type);
printf("Size: %04x\n", header.Size);
printf("Reserved: %02x\n", header.Reserved1);
printf("Reserved: %02x\n", header.Reserved2);
printf("Offset: %04x\n", header.OffBits);

一切都应该相等:
Type: 0x424d
Size: 0x00060436
保留1:0x00
保留2:0x00
抵消:0x00000436

实际发生了什么(printf 输出):
Type: 0x424d
Size: 0x0006
预订的:0x002
预订的:0x436
抵消:0x280000

(我的操作系统是 32 位 ubuntu,如果有帮助的话)


当读取此类文件时,我认为一个好的方法是首先将它们作为字节流读取(unsigned char),然后,如果需要,根据正确的数据类型解释部分文件内容。

例如,在你的情况下,我会定义BITMAPFILEHEADER像这样的结构:

typedef struct _BITMAPFILEHEADER {
    unsigned char   Type[ 2 ];
    unsigned int    Size;          // Size of the BMP file in bytes 
    unsigned char   Reserved1[ 2 ];
    unsigned char   Reserved2[ 2 ];
    unsigned int    OffBits;       // Starting address of the pixel array 
} BITMAPFILEHEADER;

然后,我将读取标头内容作为 14 字节的块,最后,我将继续填充BITMAPFILEHEADER结构正确。

下面您可以找到一个简单的程序,它读取 BMP 文件的标头并将其打印到屏幕上。

int main
    (
    )
    {
    // Defines a few variables
    FILE*           fp   =  0;
    unsigned char   h[ 14 ];

    // Opens the BMP file
    fp   =   fopen( "img.bmp", "rb" );

    if ( fp == NULL )
        {
        printf( "Cannot open file\n" );
        return -1;
        }

    // Reads the BMP header (14 bytes)
    fread( h, 14, 1, fp );

    // Prints the header contents
    printf( "Type:     %02x%02x\n", h[ 0 ], h[ 1 ] );
    printf( "Size:     %02x%02x%02x%02x\n", h[ 2 ], h[ 3 ], h[ 4 ], h[ 5 ] );
    printf( "Reserved: %02x%02x\n", h[ 6 ], h[ 7 ] );
    printf( "Reserved: %02x%02x\n", h[ 8 ], h[ 9 ] );
    printf( "Offset:   %02x%02x%02x%02x\n", h[ 10 ], h[ 11 ], h[ 12 ], h[ 13 ] );

    return 0;
    }

注 1 - 填充:从 BMP 文件格式规范中,我们知道文件头的长度为 14 个字节,而printf( "%d", sizeof(BITMAPFILEHEADER) )由于填充,将显示不同的(更大!)数字(请参阅对您的问题的评论)。

注 2 - 字节顺序:当分别将 2 或 4 个字节写入短字节或长字节时,必须考虑字节序。这意味着您必须知道如何将值写入文件(对于位图标头,它们使用小端表示法表示)以及您的机器如何处理它们(可能以小端表示法)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fread into struct 读取数据不正确 的相关文章

随机推荐