提升序列化数据的十六进制十进制编码
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
我们可以看到123
和31
,所以这里没有问题,它们都是十进制格式。
现在我将缓冲区更改为 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。
【讨论】:
以上是关于提升序列化数据的十六进制十进制编码的主要内容,如果未能解决你的问题,请参考以下文章