读取来自提升binary_iarchive不正确的数据

incorrect data from boost binary_iarchive read

本文关键字:iarchive 不正确 数据 binary 读取      更新时间:2023-10-16

我正在尝试从二进制文件中读取自定义数据

#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <fstream>
struct Data 
{
int xs, ys;
double ullat, ullon, lrlat, lrlon;
double minval, maxval;
// and some vector of floats
};
namespace boost { 
namespace serialization {
template <class Archive>
void
serialize (Archive& ar, Data& d, const unsigned int version)
{
ar & d.xs & d.ys;
ar & d.ullat & d.ullon & d.lrlat & d.lrlon;
ar & d.minval & d.maxval;
}
} // namespace serialization
} // namespace boost
int main (void)
{
std::ifstream fin ("test.bin", std::ios::in | std::ios::binary);
// the binary file was not created by boost serialization library. No header information
boost::archive::binary_iarchive arc (fin, boost::archive::no_header); 
Data d;
arc >> d;
}

在此之后,d包含垃圾值(巨大的 -ve 或 +ve 数字(。

如果我使用fstream::read按照d的布局读取文件,我会得到正确的值。我无法弄清楚这里发生了什么。正如我在代码中评论的那样,二进制文件不是由 boost 序列化库创建的。因此使用no_header标志。

我使用十六进制查看器工具(Linux 上的 ghex(检查了二进制文件,fstream::read返回正确的值。这里可能出了什么问题?

我正在使用带有 boost 1.70 和 c++17 的 gcc-8.3 和 VS2017

正如我在代码中评论的那样,二进制文件不是由 boost 序列化库创建的。

在这种情况下,您将无法使用boost::archive::binary_iarchive读取文件,除非您的文件碰巧偶然共享完全相同的二进制格式。

您需要为加载存档概念创建一个新的实现,因为 Boost 调用它。换句话说,与当前格式匹配的新archive类型(至少用于加载(。

因此使用no_header标志。

此标志仅跳过boost::archive::binary_oarchive写入以检查大小/字节序等的标头,但在不知道其格式的情况下,它无法读取数据。这就是为什么你必须编写自己的档案。