我正在尝试使用fread()从文件中读取加密的struct数据。一旦我得到解密的struct字节,我想把它们放回到这个结构中。
struct data
{
std::string s1;
std::string s2;
std::string s3;
LONG l;
};
如何将结构转换为可以从字节重构的字节?
答案 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);
}
当然,做错误检查和什么不