在不同平台上序列化和应对UINT64_T-不同的结果
Serializing and Deserializing uint64_t - different results on different platforms
i序列化并在我的代码中使用两个助手功能序列化uint64_t:
void CSerializer::Write_uint64(const uint64_t& ruiValue )
{
#if BYTE_ORDER == BIG_ENDIAN
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 56));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 48));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 40));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 32));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 24));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 16));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 8));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 0));
#else
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 0));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 8));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 16));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 24));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 32));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 40));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 48));
m_vBuffer.push_back(static_cast<uint8_t>(ruiValue >> 56));
#endif
}
uint64_t CSerializer::Read_uint64()
{
uint64_t uiret;
#if BYTE_ORDER == BIG_ENDIAN
uiret = ((static_cast<uint64_t>( m_vBuffer[m_iOffset + 0]) << 56) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 1]) << 48) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 2]) << 40) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 3]) << 32) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 4]) << 24) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 5]) << 16) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 6]) << 8) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 7]) << 0));
#else
uiret = ((static_cast<uint64_t>( m_vBuffer[m_iOffset + 0]) << 0) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 1]) << 8) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 2]) << 16) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 3]) << 24) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 4]) << 32) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 5]) << 40) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 6]) << 48) |
(static_cast<uint64_t>( m_vBuffer[m_iOffset + 7]) << 56));
#endif
m_iOffset += sizeof(uint64_t);
return uiret;
}
然后我用简单的检查测试结果:
CSerializer _Ser;
_Ser.Write_uint64(1234567890123456789);
uint64_t uiResults = _Ser.Read_uint64();
printf("- %lin", uiResults);
FILE *fp;
fp=fopen("dump.dat","wb");
for(int a = 0; a < _Ser.GetBuffer().size(); a++)
{
fprintf(fp, "%c", _Ser.GetBuffer()[a]);
}
fclose(fp);
,但结果在两个平台(MAC OSX/Raspberry)上不相等,这是结果:
MacBook:SerializerTest cdr$ uname -a
Darwin MacBook.local 13.0.0 Darwin Kernel Version 13.0.0: Thu Sep 19 22:22:27 PDT 2013; root:xnu-2422.1.72~6/RELEASE_X86_64 x86_64
MacBook:SerializerTest pawel$ ./SerializerTest
- 1234567890123456789
MacBook:SerializerTest pawel$ hexdump dump.dat
0000000 15 81 e9 7d f4 10 22 11
0000008
MacBook:SerializerTest cdr$
root@raspberrypi:/G/SerializerTest# uname -a
Linux raspberrypi 3.10.25+ #622 PREEMPT Fri Jan 3 18:41:00 GMT 2014 armv6l GNU/Linux
root@raspberrypi:/G/SerializerTest# ./SerializerTest
- 287445236
root@raspberrypi:/G/SerializerTest# hexdump dump.dat
0000000 8115 7de9 10f4 1122
0000008
root@raspberrypi:/G/SerializerTest#
我可以看到(在十六进制中)互换了值,我无法弄清楚什么问题...
字节没有互换,默认情况下hexdump
在某些平台上显示2个字节INT。您应该能够使用hexdump -C
获得1字节INT。同样,在32位架构(例如Raspberry Pi)上,Printf格式"%li"(长INT)也适用于32位INT。您需要"%lli"才能正确显示64位int。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- 如果FF的参数为UINT64类型,则无法返回正确的结果