c中读取BMP文件时读取头数组中存储的信息

Reading information stored in header array when reading BMP file in c

我正在尝试使用 c 学习图像处理。

#include <stdio.h>

int main(){
    FILE *streamIn;
    streamIn=fopen("lena512.bmp","r");

    //read imageHeader and colorTable
    unsigned char header[54];//to store the image header
    //unsigned char colorTable[1024];//to store the colorTable,if it exists

    for(int i=0;i<54;i++){
            header[i]=getc(streamIn);
    }
    /*
      width of the image(18th byte)
      height of the image(22nd byte)
      bitDepth of the image(28th byte)
    */
    int width=*(int*)(&header[18]);
    int height=*(int*)(&header[22]);
    int bitDepth=*(int*)(&header[28]);


}

我遇到了我无法理解的线。

int width=*(int*)(&header[18]);

为什么我们不能像 int width=(int)(header[18]);?

那样简单地进行类型转换

您正在使用*(int*)(&header[18]),想知道为什么(int)(header[18])不能使用。

嗯,这是完全不同的表达方式。

第一个采用 header[18] 的地址,这是一个 unsigned char,所以这给出了指向此类的指针。将其转换为指向 int 的指针并在赋值中通过 * 取消引用它复制一个完整的 int 从该地址开始,读取所有必要的字节。

第二个简单地读取 header[18] 中的单个 unsigned char 并将 转换为 int。这将仅使用第一个字节。


注意:Microsoft 的 header 文件提供了 BMP header 的结构定义。使用它们要好得多。例如,您可以调用 fread() 来阅读 header.

I came across the line which i couldn't understand.
int width=*(int*)(&header[18]);

写它的人也没有,因为这是在几个不同方面公然未定义的行为。它给出了一个未对齐的地址(在主流系统上)以及一个严格的别名违规。 What is the strict aliasing rule?

最后那三行是bug,你不能那样写C代码。编写此程序的正确方法可能是将数据复制到由 OS API.

提供的预定义结构中