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

时间:2018-06-11 06:26:17

标签: c++ arrays pointers boost deserialization

我收到了一个文件,其中包含以自定义格式存储的数据,例如“data.asd”,并负责从中提取信息。我得到了“.asd”格式的文件规范。

所有asd文件都以0x0开头,以5字节“Hello”开头,第6位以\ 0终止开头。接下来的32位是指向条目列表的指针,该列表是127个条目的数组。每个条目包含一个16 char空终止字符串,一个指向某些数据的指针,以及一个告诉数据大小的大小变量。值0xFFFFFFFF表示列表的结尾。

我考虑使用C ++ boost序列化库,但在尝试打开文件时出错。我假设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'并重建变量,但我不确定如何处理指针。

1 个答案:

答案 0 :(得分:1)

你可以记忆地图并使用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_('\0'), length);