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

Posted

技术标签:

【中文标题】提升序列化数据的十六进制十进制编码【英文标题】:boost serialization hexadecimal decimal encoding of data 【发布时间】:2014-11-14 15:28:18 【问题描述】:

我是提升序列化的新手,但这对我来说似乎很奇怪。

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

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,代码是相同的,所以我没想到这会是个问题。

【问题讨论】:

您应该显示执行序列化的代码。 编辑您的帖子并将代码放在那里。确保它缩进了四个空格,并且它也应该突出显示语法。它将使人们更容易阅读并更有可能提供帮助。 史蒂夫现在是这个样子。 我认为 Boost 没有“切换到十六进制”。老实说,我对此没有任何经验,但看起来 boost 正在序列化为一个字节数组,它只能保存从 0 到 255 的数字。1024 将是一个值为 4 的字节,后跟一个字节值0 嗨,史蒂夫,你是对的。我假设 04 00 是 400 hex 这将是 1024 但就像你说的那样,它实际上是字节数组......我应该尝试一些其他数字......我现在可以修复它。谢谢 【参考方案1】:

我认为 Boost 不会“切换到十六进制”。老实说,我对此没有任何经验,但看起来 boost 正在序列化为一个字节数组,它只能保存从 0 到 255 的数字。1024 将是一个值为 4 的字节,后跟一个值为0.

【讨论】:

【参考方案2】:

“为什么 31 没有转换为 1F?它不一致” - 你的假设正在造成错误的不一致。当您实际上只是在猜测时,请停止假设您可以阅读序列化存档格式。

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

如果您想要“人类可访问的表单”,请考虑使用 xml_oarchive。

【讨论】:

以上是关于提升序列化数据的十六进制十进制编码的主要内容,如果未能解决你的问题,请参考以下文章

序列化 std::vector 以提升二进制存档时的数据相关失败

Go:专属二进制编码方式Gob

java编解码技术,json序列化与二进制序列化

20二进制文件操作

c# 对象二进制序列化

Qt学习之QDataStream