代码之家  ›  专栏  ›  技术社区  ›  cpx

字节结构

  •  0
  • cpx  · 技术社区  · 14 年前

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

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

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

    4 回复  |  直到 14 年前
        1
  •  1
  •   Billy ONeal IS4    14 年前

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

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

        2
  •  1
  •   sblom    14 年前

    我会做如下的事情:

    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;
    }
    
        3
  •  0
  •   Alexander Gessler    14 年前

    对于一般情况,编写一个函数手动序列化结构中的所有成员,另一个函数按顺序反序列化所有成员,从字节流创建结构。您可以使用脚本来为您生成这些功能(可悲的是,C++不支持像Java的反射之类的东西)。

    你可以看看 boost/serialization .

        4
  •  0
  •   Michael    14 年前
    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);
    }
    

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