内存填充问题

Memory padding issue

本文关键字:问题 填充 内存      更新时间:2023-10-16

我正在处理一个示例应用程序,在这个应用程序中,我正在序列化一些数据。在客户端应用程序中,我正在读取序列化的数据。当我这样做的时候,我观察到一些奇怪的行为。

示例应用程序中对象的大小与客户端中数据的大小不同。我认为这是因为内存填充。我的问题是我正试图写"BRUSHOBJ"文件。这个结构是由Microsoft定义的。我可以改变这个结构的声明。请告诉我如何解决这个问题。

请让我知道如何在诽谤的数据类型上应用内存填充

听起来好像您只是试图将struct的地址转换为char*,用ostream::write。这根本行不通。有填充,但也有不同类型的大小不同的平台会有所不同)、字节顺序等等外来平台(包括大多数大型机)数据表示本身。通常,您需要一个输出数据应该是什么样子的规范比如,一个字节一个字节地写,然后你必须用需要价值。

这只是针对简单类型。快速浏览一下BRUSHOBJ显示它包含一个指针,你可能需要跟着,你肯定得做点什么,因为接收端不能用指针做任何事数据。(考虑到描述,我怀疑您将不得不转换它转换成某种标识符,并且还传输一个字典映射对象的这种标识符。但我不太清楚这是怎么回事结构是用来确定的)

你有两个选择

  • 序列化数据
  • #pragma pack修改内存填充

序列化数据与内存填充无关,您只是定义了一种向内存位置(内存流)写/读回内存的方法。

我看到_BRUSHOBJ结构体有以下定义,

typedef struct _BRUSHOBJ {
  ULONG  iSolidColor;
  PVOID  pvRbrush;
  FLONG  flColorType;
} BRUSHOBJ;

请注意,跨进程发送指针是没有意义的。指针的序列化应该通过写入内存大小和内存本身来完成。无论如何,如果你想传递这个BRUSHOBJ到一个窗口函数,你可以得到未定义的行为。这不是跨进程传递BRUSHOBJ的支持/文档方式。

内存填充可以像这样应用

#pragma pack(push)
#pragma pack(4)
struct myStruct
{
   char Char1
   int Int1;
};
#pragma pack(pop)