如何在C++中从头开始反序列化文件(没有库)

How to Unserialize File From Scratch (without library) In C++

本文关键字:文件 反序列化 C++ 从头开始      更新时间:2023-10-16

我得到了一个文件,其中包含以自定义格式存储的数据,例如"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);