我正在尝试这段代码,首先将 uint64 数字拆分为 uint8 数组,然后将所述数组合并回原始数字。
但是当我尝试打印出号码时out
,它似乎返回 uint64 的最大值。
uint8 buf[8];
uint64 test = 123456789012;
uint64 out = 0;
Uint64toUint8Arr(buf, test, 0);
out = Uint8ArrtoUint64(buf, 0);
std::cout << "out is " << out << std::endl;
我的函数定义为:
void Uint64toUint8Arr (uint8* buf, uint64 var, uint32 lowest_pos)
{
buf[lowest_pos] = (var & 0x00000000000000FF) >> 0 ;
buf[lowest_pos+1] = (var & 0x000000000000FF00) >> 8 ;
buf[lowest_pos+2] = (var & 0x0000000000FF0000) >> 16 ;
buf[lowest_pos+3] = (var & 0x00000000FF000000) >> 24 ;
buf[lowest_pos+4] = (var & 0x000000FF00000000) >> 32 ;
buf[lowest_pos+5] = (var & 0x0000FF0000000000) >> 40 ;
buf[lowest_pos+6] = (var & 0x00FF000000000000) >> 48 ;
buf[lowest_pos+7] = (var & 0xFF00000000000000) >> 56 ;
}
uint64 Uint8ArrtoUint64 (uint8* var, uint32 lowest_pos)
{
return (var[lowest_pos+7] << 56) |
(var[lowest_pos+6] << 48) |
(var[lowest_pos+5] << 40) |
(var[lowest_pos+4] << 32) |
(var[lowest_pos+3] << 24) |
(var[lowest_pos+2] << 16) |
(var[lowest_pos+1] << 8) |
(var[lowest_pos] << 0);
}
我的问题是我拆分或合并 uint64 数字的方式是否出错?我对 uint32 类型做了类似的函数,看起来没问题。
问题是你正在转移uint8
in Uint8ArrtoUint64()
功能超过8位。据我所知,这是未定义的行为。无论如何,返回值是 uint8,所以你要“或”八次八uint8
数字,最后你只有 uint8 数字,而不是 uint64!你需要将它们投射到uint64
首先,然后转移。
uint64 Uint8ArrtoUint64 (uint8* var, uint32 lowest_pos)
{
return (((uint64)var[lowest_pos+7]) << 56) |
(((uint64)var[lowest_pos+6]) << 48) |
(((uint64)var[lowest_pos+5]) << 40) |
(((uint64)var[lowest_pos+4]) << 32) |
(((uint64)var[lowest_pos+3]) << 24) |
(((uint64)var[lowest_pos+2]) << 16) |
(((uint64)var[lowest_pos+1]) << 8) |
(((uint64)var[lowest_pos]) << 0);
}
Note: As @interjay 指出 https://stackoverflow.com/questions/25669317/merging-uint8-array-into-uint64-error/25669375?noredirect=1#comment40114832_25669375,对 uint8 进行移位操作实际上会得到 uint32。我对此不太确定,但无论如何最好还是提一下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)