struct to bytes

时间:2010-04-24 23:13:24

标签: c++ serialization

我正在尝试使用fread()从文件中读取加密的struct数据。一旦我得到解密的struct字节,我想把它们放回到这个结构中。

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

如何将结构转换为可以从字节重构的字节?

4 个答案:

答案 0 :(得分:1)

问题是std::string不包含有问题的字节,它包含指针到您实际想要存储的字节。您应该将每个字符串保存为以空字符结尾的字符串,然后在文件中保存一个原始字符。

如果您正在寻找.NET提供的“点击式”序列化解决方案,您将找不到您在C ++中寻找的内容。 Boost's serialization library可能会有所帮助,因为它会为您序列化一些标准库对象,但您需要为用户定义的类创建自己的实现。

答案 1 :(得分:1)

我会做类似的事情:

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;
}

答案 2 :(得分:0)

对于一般情况,编写一个函数来手动序列化结构中的所有成员,另一个函数通过按顺序反序列化所有成员来从字节流创建结构。您可以使用脚本为您生成这些函数(遗憾的是,C ++不支持Java反射等内容)。

您可以查看boost/serialization

答案 3 :(得分:0)

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);
}

当然,做错误检查和什么不