C 处理位图头

C 处理位图头,c,image,bitmap,directx,C,Image,Bitmap,Directx,关于结构,我有两个问题 首先,如果我们制作该结构的自己版本,分配的内存将16字节。但是的是14个字节。为什么会这样 第二,正如您已经知道的,位图头是LittleEndianed。因此,当您希望正确访问该值时,需要将其转换为Big-Endian。然而,如果你看到了,你会发现被接受的答案没有任何作用。你们能解释一下怎么可能吗 提前感谢您的帮助。一个文件可以有任何类型的对齐方式,位图文件的头恰好是14个字节(有关详细信息:)。没有任何规则规定所有内容都必须对齐(SSE指令除外,它们期望所有内容都对齐)

关于结构,我有两个问题

首先,如果我们制作该结构的自己版本,分配的内存将16字节。但是的是14个字节。为什么会这样

第二,正如您已经知道的,位图头是LittleEndianed。因此,当您希望正确访问该值时,需要将其转换为Big-Endian。然而,如果你看到了,你会发现被接受的答案没有任何作用。你们能解释一下怎么可能吗


提前感谢您的帮助。

一个文件可以有任何类型的对齐方式,位图文件的头恰好是14个字节(有关详细信息:)。没有任何规则规定所有内容都必须对齐(SSE指令除外,它们期望所有内容都对齐)。对齐的数据可以更快地访问,因此建议您对齐数据,但不必这样做。文件格式也没有对齐它们的数据


如果要读取值,需要将其转换为big-endian,但如果只想创建一个新位图,则必须以BITMAPFILEHEADER结构中预期的格式存储数据,即little-endian。

您的意思是,创建位图时,endianness不重要吗。。?真的吗?如果我不太清楚的话,很抱歉。Endianness始终很重要,但我的意思是,无论运行的平台的Endianness如何,都需要以文件规范中指定的相同Endianness将数据写入文件。对于人类来说,以big-endian读取值是有意义的,但是如果将big-endian写入BMP文件,则该文件将不正确。我不是说将数据写入文件。一、 当然,BMP文件应该是little endian。但是在将bmp加载到字节数组之后,为了让windows正确读取该结构的值,我想应该考虑字节数组的endianness。是的,这是真的,当您实际使用例如像素数据时,您需要考虑endianness。但你问,在你提供的链接中,答案与endianness无关。这是因为他调用CreateDIBitmap,它只生成一个标题。您不必担心传递给该方法的值的终结性。这就是你的问题的解释:)我认为CreateDIBitmap关心endianness。正如您在CreateDIBitmap接收的参数中所看到的,很明显,该函数将尝试访问结构BitMapInfo Header的值,而不考虑endianness。