Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C+中从头开始取消序列化文件(无库)+;_C++_Arrays_Pointers_Boost_Deserialization - Fatal编程技术网

C++ 如何在C+中从头开始取消序列化文件(无库)+;

C++ 如何在C+中从头开始取消序列化文件(无库)+;,c++,arrays,pointers,boost,deserialization,C++,Arrays,Pointers,Boost,Deserialization,我得到了一个文件,其中包含以自定义格式存储的数据,例如“data.asd”,并负责从中提取信息。我得到了一个“.asd”格式的文件规范 所有asd文件都从0x0开始,0x0以5个字节“Hello”开始,第6个字节用于\0终止。接下来的32位是指向条目列表的指针,该列表是由127个条目组成的数组。每个条目都包含一个以16个字符的null结尾的字符串、一个指向某些数据的指针和一个告诉数据大小的大小变量。值0xFFFFFF表示列表结束 我已经研究过使用C++ Boost序列化库,但在尝试打开文件时会出

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

所有asd文件都从0x0开始,0x0以5个字节“Hello”开始,第6个字节用于\0终止。接下来的32位是指向条目列表的指针,该列表是由127个条目组成的数组。每个条目都包含一个以16个字符的null结尾的字符串、一个指向某些数据的指针和一个告诉数据大小的大小变量。值0xFFFFFF表示列表结束

我已经研究过使用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
ifs.open(文件名,ios::in | ios::binary);
//将所有二进制内容复制到缓冲区中
矢量缓冲器((
istreambuf_迭代器(ifs)),
(istreambuf_迭代器());
memmove(s,&buffer.at(0),6);//将字符数组“hello”移动到字符串s中
我应该能够通过检查终止位来确定数据、条目列表和字符串的结束位置。这样,我就可以通过使用memmove获取数据,并通过检查位来序列化文件


就我而言,还有更好的选择吗?如果我一直在使用memmove,我怎么知道指针指向什么?使用memmove,我可以将六位移到字符串“s”中并重新生成变量,但我不确定如何处理指针。

您可以使用Boost-Endian进行内存映射

或者,您可以使用Boost Spirit的二进制解析器:

有一个例子:

 std::uint32_t length;

 bool valid = qi::parse(first, last,
      "Hello" >> qi::little_word >> char_('\0'), length);

假设“指针”只是文件开头的整数字节偏移量,我将读取32位指针,并将其分配给指针变量,然后读取指针的值。那么该值是0x0的偏移量?这就是阵列的起点。是这样吗?我确实读过指针是相对于文件开头的,这是有意义的。32位不能放在一个字节中。每个数字使用的字节顺序。也许你应该改写问题标题。如果你能背诵准确的格式,那就不是“未知类型”。你可能只是想说“我如何从零开始解析文件格式(没有库)”@Jasen这听起来可能很愚蠢,但在现代计算机中,32位不就是4字节吗?我检查了sizeof(指针),它返回了4个字节,所以它不适合吗?字节顺序是小端。