如何在C++中从头开始反序列化文件(没有库)
How to Unserialize File From Scratch (without library) In C++
我得到了一个文件,其中包含以自定义格式存储的数据,例如"data.asd",并负责从中提取信息。我得到了".asd"格式的文件规范。
所有 asd 文件都以 0x0 开头,以 5 个字节"Hello"开头,第 6 个字节以 \0 结尾。接下来的 32 位是指向条目列表的指针,该列表是一个包含 127 个条目的数组。每个条目包含一个以 16 个字符的 null 结尾字符串、一个指向某些数据的指针和一个告知数据大小的大小变量。值0xFFFFFFFF表示列表的末尾。
我已经考虑使用C++提升序列化库,但是当我尝试打开文件时出现错误。我假设 boost 只能读取它写入的文件。
std::ifstream ifs("data.asd");
boost::archive::binary_iarchive in_arch(ifs);
从那以后,我通过在 ifstream 中打开、将二进制文件复制到向量中,然后使用 memmove 来"手动"检查序列化。
ifs.open(fileName, ios::in | ios::binary);
//copy all contents in binary into buffer
vector<char> buffer((
istreambuf_iterator<char>(ifs)),
(istreambuf_iterator<char>()));
memmove(s, &buffer.at(0), 6); // move char array 'hello' into string s
我应该能够通过检查终止位来确定数据、条目列表和字符串的结尾。这样我就可以通过使用memmove并通过检查位来序列化文件。
就我而言,还有更好的选择吗?如果我在使用memmove时遇到困难,我如何弄清楚指针指向什么?使用 memmove,我能够将六个位移动到字符串"s"中并重建变量,但我不确定如何处理指针。
您可以内存映射事物并使用Boost Endian。
或者,您可以使用Boost Spirit的二进制解析器:https://www.boost.org/doc/libs/1_51_0/libs/spirit/doc/html/spirit/qi/reference/binary.html
举个例子:
std::uint32_t length;
bool valid = qi::parse(first, last,
"Hello" >> qi::little_word >> char_(' '), length);
相关文章:
- 如何知道QDataStream不能反序列化某些内容
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何反序列化数组?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 通过 tcp 发送 C# 类并在 C++ 上反序列化
- 序列化和反序列化boost共享指针
- 在C++中使用POCO和grain对多个对象进行反序列化
- C++中整数向量的序列化/反序列化
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 使用 QDataStream 对原始数据进行反序列化
- 使用协议缓冲区创建通用反序列化程序
- 如何在C++中从头开始反序列化文件(没有库)
- 在协议缓冲区 c++ 中反序列化字符串数组
- 如何反序列化包含多个记录的文件
- 如何通过从文件中读取来反序列化C++的字节数组
- 反序列化Google Protobuf二进制文件
- 从流或文件动态反序列化数据
- 反序列化中的文件损坏,如何防止崩溃