我目前正在尝试使用以下代码读取位图文件头:
#include <fstream>
using namespace std;
struct BitMapFileHeader {
uint16_t bfType;
uint32_t bfSize;
uint16_t bfReserved1;
uint16_t bfReserved2;
uint32_t bfOffBits;
} file_header;
int main() {
ifstream fin;
fin.open("input.bmp", ios::binary);
fin.read(reinterpret_cast<char*>(&file_header), sizeof(file_header));
}
我文件的前几个字节是42 4D 36 53 07 00 00 00
。 file_header.bfType
显示第一个和第二个字节中包含的19778
的正确值,但是filder_header.bfSize
显示7
,它存储在第5个字节中,并且似乎跳过了第3个和第4个字节。看来我遇到了this问题的第二个答案的注释中提到的问题。尽管确定了问题,但我不知道如何解决。有人可以指出我正确的方向吗?
编辑:由于性能问题和未对齐的内存访问,一些建议不要打包结构成员。除了一个一个地填充每个struct成员之外,还有什么方法可以避免这种性能损失?
最佳答案
在struct之后使用__attribute__ ((packed))
:
struct BitMapFileHeader {
uint16_t bfType;
uint32_t bfSize;
uint16_t bfReserved1;
uint16_t bfReserved2;
uint32_t bfOffBits;
} __attribute__ ((packed)) file_header;
关于c++ - 如何从二进制文件填充结构,同时避免内存对齐填充引起的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64872214/