C Linux和Windows上结构的不同值
我目前正在做一个C项目,我应该在.bmp图像中隐藏文本 因此,我打开一个图像,将文件头和信息头写入两种结构:C Linux和Windows上结构的不同值,c,linux,windows,structure,fseek,C,Linux,Windows,Structure,Fseek,我目前正在做一个C项目,我应该在.bmp图像中隐藏文本 因此,我打开一个图像,将文件头和信息头写入两种结构: typedef struct _BitmapFileHeader_ { uint16_t bfType_; uint32_t bfSize_; uint32_t bfReserved_; uint32_t bfOffBits_; } __attribute__((packed)) BitmapFileHeader; typedef struct _BitmapInfo
typedef struct _BitmapFileHeader_
{
uint16_t bfType_;
uint32_t bfSize_;
uint32_t bfReserved_;
uint32_t bfOffBits_;
}
__attribute__((packed))
BitmapFileHeader;
typedef struct _BitmapInfoHeader_
{
uint32_t biSize_;
int32_t biWidth_;
int32_t biHeight_;
uint16_t biPlanes_;
uint16_t biBitCount_;
uint32_t biCompression_;
uint32_t biSizeImage_;
int32_t biXPelsPerMeter_;
int32_t biYPelsPerMeter_;
uint32_t biClrUsed_;
uint32_t biClrImportant_;
}BitmapInfoHeader;
BitmapFileHeader* bitmap_headerdata = NULL;
BitmapInfoHeader* bitmap_infodata = NULL;
文件名是以前定义的
int readBitmapFile (char* filename, BitmapFileHeader** bitmap_headerdata,
BitmapInfoHeader** bitmap_infodata, unsigned char** bitmap_colordata)
{
FILE* bmp_file;
bmp_file = fopen(filename, "rb");
fseek(bmp_file, 0, SEEK_SET); // Set File Cursor to beginning
fread((*bitmap_headerdata), sizeof(**bitmap_headerdata), 1, bmp_file);
fseek(bmp_file, sizeof(**bitmap_headerdata), SEEK_SET);
fread((*bitmap_infodata), sizeof(**bitmap_infodata), 1, bmp_file);
int checkinfo = sizeof(**bitmap_infodata);
int checkheader = sizeof(**bitmap_headerdata);
printf("Size of Infodata: %d\nSize of Headerdata: %d\n", checkinfo, checkheader);
....
}
当我打开一个有效的位图(24位,未压缩)并在Linux上将bfType_、bibiBitCount和biCompression的值与19778,24,0进行比较时,它工作正常,但当我尝试在Windows上运行它时,程序在将biBitCount与24进行比较时停止。
当我调试这个程序时,我注意到“bitmap_infodata”中的所有值都比它们应该在的位置高一行(当我像表格一样查看它时)。
然后我比较了Linux和Windows上的sizeof(**位图_headerdata),发现Linux上是14,Windows上是16
这不应该是一样的吗?为什么位图头数据结构在两个操作系统上的值相同,但位图头数据不同
Bernhard问题在于结构在不同环境中的填充方式不同 这个问题有两种解决方案 1:逐字段读取标题
2:删除结构填充。这样做的语法各不相同。有些编译器使用
#PRAGMA PACK
。您使用的是\uuuu attribute\uuuuuuu((\ uuuu packed\uuuuuu))
,这显然在两种平台上都不起作用。在mingw gcc中,packed
属性被破坏:
您可能想考虑使用:
#pragma pack(1)
struct BitmapFileHeader {
...
};
#pragma pack()
和
-mno ms位域
标志。您在windows上使用的是哪种编译器?您假设结构在不同的编译器/平台上的布局相同。您已经被逐位内存对齐。检查两个平台上的sizeof(BitmapFileHeader)
我正在使用MinGW gcc(嵌入在Eclipse中)Ok,即使它们的布局不完全相同,当我想跳转到sizeof(*bitmap\u headerdata)时,我应该到达infodata部分的第一个字节?@Beani:不,如果是“sizeof(*bitmap\u headerdata)”的话该文件中的值与代码已知的sizeof(*bitmap\u headerdata)
不同。