提升序列化十六进制数据的十进制编码

时间:2014-11-14 15:28:18

标签: c++ boost boost-serialization

我是新手来推动序列化,但这对我来说似乎很奇怪。

我有一个非常简单的课程,有两个成员

int number // always = 123

char buffer[?] // buffer with ? size

所以有时我将大小设置为buffer[31]然后我将类序列化

22 serialization::archive 8 0 0 1 1 0 0 0 0 123 0 0 31 0 0 0 65 65

我们可以看到12331所以这里没有问题都是十进制格式。

现在我将缓冲区更改为buffer[1024],所以我希望看到

22 serialization::archive 8 0 0 1 1 0 0 0 0 123 0 0 1024 0 0 0 65 65 ---

这是实际结果

22 serialization::archive 8 0 0 1 1 0 0 0 0 123 0 0 0 4 0 0 65 65 65

boost仅针对缓冲区大小切换为十六进制?

注意另一个值仍为十进制。

那么如果我将数字从123切换到1024会怎样?

我会想象040?

22 serialization::archive 8 0 0 1 1 0 0 0 0 1024 0 0 0 4 0 0 65 65

如果这是设计,为什么31不能转换为1F?它不一致。

这会导致我们的split_free的加载函数出现问题,我们正在这样做

unsigned int size;
ar >> size; 

但正如你可能猜到的那样,当它是040时,它会截断为零:(

建议的解决方案是什么?

我使用的是boost 1.45.0,但我在boost 1_56.0上进行了测试,结果相同。

编辑:序列化函数的样本

template<class Archive>
void save(Archive& ar, const MYCLASS& buffer, unsigned int /*version*/) {
    ar << boost::serialization::make_array(reinterpret_cast<const unsigned char*>(buffer.begin()), buffer.length());
}

MYCLASS只是char *的包装器,第一个元素是unsigned int  保持长度接近UNICODE_STRING

http://msdn.microsoft.com/en-gb/library/windows/desktop/aa380518(v=vs.85).aspx

如果长度为1024或31,代码是相同的,所以我不希望这是一个问题。

2 个答案:

答案 0 :(得分:0)

&#34;为什么31没有转换为1F?它不一致&#34; - 你的假设造成了错误的不一致。假设您实际上只是猜测时可以阅读序列化归档格式。

如果您想知道,请跟踪代码。如果没有,只需使用存档格式。

如果您想要&#34;人类可访问的表单&#34;,请考虑xml_oarchive。

答案 1 :(得分:0)

我不认为Boost&#34;切换到十六进制&#34;。老实说,我对此没有任何经验,但看起来boost是序列化为一个字节数组,只能保存0到255之间的数字.1024是一个字节值为4后跟一个字节值0。