将uint8数组合并到uint64错误中

时间:2014-09-04 15:24:26

标签: c bit-shift uint64

我正在尝试这个代码,我首先将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类型做了类似的功能,看起来没问题。

1 个答案:

答案 0 :(得分:2)

问题是你在uint8函数中移动了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);
}

注意:作为@interjay noted,对uint8的转换操作实际上会给我们uint32。我不确定,但无论如何最好提一下。