Проблема заполнения памяти - PullRequest
0 голосов
/ 01 августа 2011

Я работаю над примером приложения в этом приложении. Я сериализую некоторые данные. В клиентском приложении я читаю сериализованные данные обратно. При этом я заметил странное поведение.

В примере приложения размер объекта отличается от размера данных в клиенте. Я думаю, что это из-за заполнения памяти. Моя проблема в том, что я пытаюсь записать «BRUSHOBJ» в файл. Эта структура определяется Microsoft. Я могу изменить объявление этой структуры. Пожалуйста, дайте мне знать, как решить эту проблему.

Пожалуйста, дайте мне знать, как применить заполнение памяти к клеветническому типу данных.

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

Звучит так, будто вы пытаетесь просто привести адрес от struct к char* и использовать на нем ostream::write.Это просто не работает.Есть заполнение, но есть также размер различных типов (которые варьируются от одной платформы к другой), порядок байтов и на некоторых более экзотических платформах (включая большинство мэйнфреймов) представление самих данных.Как правило, вам необходимо указать, как должны выглядеть выходные данные, побайтно, а затем вы должны записать каждый байт с требуемым значением.

И это только для простых типов.Быстрый взгляд на BRUSHOBJ показывает, что он содержит указатель, которому вы, вероятно, должны будете следовать - вам, безусловно, придется что-то с ним делать, поскольку принимающая сторона не сможет ничего сделать с указателем на ваши данные,(Подозреваю, учитывая описание, что вам придется преобразовать его в какой-то идентификатор, а также передать словарь, отображающий такие идентификаторы на объекты. Но я не знаю достаточно о том, как эта структура используется, чтобы быть уверенной.)

0 голосов
/ 01 августа 2011

у вас есть 2 варианта

  • сериализация данных
  • изменить заполнение памяти через #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)

Если вы хотите изменить отступы, вы должны сделать это для структуры, написанной вами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...