内存填充问题

时间:2011-08-01 13:10:01

标签: c++ visual-c++

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

在示例应用程序中,对象的大小与客户端中的数据大小不同。我认为这是因为内存填充。我的问题是我正在尝试将“BRUSHOBJ”写入文件。此结构由Microsoft定义。我可以改变这个结构的声明。请让我知道如何解决这个问题。

请告诉我如何在诽谤数据类型上应用内存填充。

2 个答案:

答案 0 :(得分:3)

听起来你正试图将struct的地址转换为 char*,并在其上使用ostream::write。这根本行不通。 有填充,但也有不同类型的大小(其中 从一个平台到下一个平台,字节顺序等等 异国平台(包括大多数大型机)数据表示本身。 通常,您需要指定输出数据的外观 比如,逐字节,然后你必须用每个字节写 要求的价值。

这仅适用于简单类型。快速浏览一下BRUSHOBJ节目 它包含一个指针,你可能不得不这样做 跟随 - 你肯定要用它做点什么,因为 接收端将无法使用指针进入您的 数据。 (我怀疑,鉴于描述,你必须转换它 转换成某种标识符,并传输字典映射 这种对象的标识符。但我不知道这是怎么回事 结构用来确定。)

答案 1 :(得分:0)

你有两个选择

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

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

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

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

请注意,跨进程发送指针是不可见的。序列化指针应该通过写入内存大小和内存本身来完成。无论如何,如果你想将这个BRUSHOBJ传递给windows函数,你可以得到未定义的行为。它不是支持/记录的将BRUSHOBJ传递给进程的方法。

内存填充可以像这样应用

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

如果要修改填充的内容,则应该对由您编写的结构进行操作。