C Linux和Windows上结构的不同值

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

我目前正在做一个C项目,我应该在.bmp图像中隐藏文本

因此,我打开一个图像,将文件头和信息头写入两种结构:

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)
不同。