我收到了一个文件,其中包含以自定义格式存储的数据,例如“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'并重建变量,但我不确定如何处理指针。
答案 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);