我正在处理这个应用程序中的示例应用程序我正在序列化一些数据。在客户端应用程序中,我正在读取序列化数据。在这样做时,我发现了一些奇怪的行为。
在示例应用程序中,对象的大小与客户端中的数据大小不同。我认为这是因为内存填充。我的问题是我正在尝试将“BRUSHOBJ”写入文件。此结构由Microsoft定义。我可以改变这个结构的声明。请让我知道如何解决这个问题。
请告诉我如何在诽谤数据类型上应用内存填充。
答案 0 :(得分:3)
听起来你正试图将struct
的地址转换为
char*
,并在其上使用ostream::write
。这根本行不通。
有填充,但也有不同类型的大小(其中
从一个平台到下一个平台,字节顺序等等
异国平台(包括大多数大型机)数据表示本身。
通常,您需要指定输出数据的外观
比如,逐字节,然后你必须用每个字节写
要求的价值。
这仅适用于简单类型。快速浏览一下BRUSHOBJ节目 它包含一个指针,你可能不得不这样做 跟随 - 你肯定要用它做点什么,因为 接收端将无法使用指针进入您的 数据。 (我怀疑,鉴于描述,你必须转换它 转换成某种标识符,并传输字典映射 这种对象的标识符。但我不知道这是怎么回事 结构用来确定。)
答案 1 :(得分:0)
你有两个选择
序列化数据与内存填充无关,您只是定义了一种向/从内存位置(内存流)写入/读回内存的方法。
我看到_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)
如果要修改填充的内容,则应该对由您编写的结构进行操作。