структура в байтах - PullRequest
       14

структура в байтах

0 голосов
/ 25 апреля 2010

Я пытаюсь прочитать зашифрованные данные структуры из файла, используя fread (). как только я получу расшифрованные байты структуры, я бы хотел вернуть их обратно в эту структуру.

struct data
{
  std::string s1;
  std::string s2;
  std::string s3;
  LONG l;
};

как бы вы преобразовали структуру в байты, которые можно восстановить из байтов?

Ответы [ 4 ]

1 голос
/ 25 апреля 2010

Проблема в том, что std::string не содержит рассматриваемых байтов, он содержит указатель на байты, которые вы действительно хотите сохранить. Вероятно, вам следует сохранить каждую строку в виде строки с нулевым символом в конце, а затем сохранить необработанный текст после этого в файле.

Если вы ищете решение для сериализации типа "укажи и щелкни", подобное тому, которое предоставляет .NET, вы не найдете то, что ищете в C ++. Библиотека сериализации Boost может быть полезна, потому что она будет сериализовать некоторые стандартные объекты библиотеки для вас, но вам понадобится ваша собственная реализация для пользовательского класса, подобного этому.

1 голос
/ 25 апреля 2010

Я бы сделал что-то вроде:

struct serialized_data {
  size_t s1_offset;
  size_t s2_offset;
  size_t s3_offset;
  long l;
  char strings[1];
};

serialized_data* serialize (data d) {
    serialized_data* s = malloc(sizeof(serialized_data) + d.s1.length() + d.s2.length() + d.s3.length() + 3);
    s->s1_offset = 0;
    s->s2_offset = d.s1.length() + 1;
    s->s3_offset = s2_offset + d.s2.length() + 1;
    s->l = d.l;
    strcpy(s->strings, d.s1.c_str());
    strcpy(s->strings + s->s2_offset, d.s2.c_str());
    strcpy(s->strings + s->s3_offset, d.s3.c_str());

    return s;
}
0 голосов
/ 25 апреля 2010
struct data 
{ 
  std::string s1; 
  std::string s2; 
  std::string s3; 
  long l; 
};


int Write(FILE* file, const data* myData)
{
   unsigned long length;

   length = myData->s1.size();
   fwrite((void*) &length, sizeof(length), 1, file);
   fwrite((void*) myData->s1.data(), length, 1, file);
   ... // write the other strings and long here
}

int Read(FILE* file, data* myData)
{
   unsigned long length;
   char* buffer;

   fread((void*) &length, sizeof(length), 1, file);
   buffer = new char[length];
   length = fread(&buffer, length, 1, file);
   myData.s1 = string(buffer, length);
}

Конечно, делайте проверку ошибок, а что нет

0 голосов
/ 25 апреля 2010

В общем случае напишите функцию для сериализации всех элементов в структуре вручную, а другую - для создания структуры из потока байтов путем десериализации всех элементов по порядку. Вы можете использовать сценарии для генерации этих функций для вас (к сожалению, C ++ не поддерживает такие вещи, как отражение Java).

Вы можете посмотреть boost / serialization .

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