矢量的字节到四字

时间:2014-09-01 03:22:03

标签: c++

我有一个字节向量,我想将它们转换为四字数据类型(64位小端)。

矢量到Dword(32位)的例子:

int DataConversor::toDword()
{
    return ((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3]));
}

根据Visual Studio 2013,问题正在以超过32个字节的未定义行为转移:

__int64 DataConversor::toQuadWord()
{
    return (__int64)((data[0] << 64 | data[1] << 56 | data[2] << 48 | data[3] << 40 |
        data[4] << 32 | data[5] << 24) | (data[6] << 16) | (data[7] << 8) | (data[8]));
}

任何实现此目的的方法,不使用_ASM指令?

3 个答案:

答案 0 :(得分:4)

嗯,data[0] << 64可能是一个意外......

data[0] << 56不是你想要的。你想要static_cast<uint64_t>(data[0]) << 56。然后,重复所有其他操作。

因此,您希望您的函数看起来像:

int64_t DataConversor::toQuadWord() {
    uint64_t result = 0;
    result |= static_cast<uint64_t>(data[0]) << 56;
    result |= static_cast<uint64_t>(data[1]) << 48;
    result |= static_cast<uint64_t>(data[2]) << 40;
    result |= static_cast<uint64_t>(data[3]) << 32;
    result |= static_cast<uint64_t>(data[4]) << 24;
    result |= static_cast<uint64_t>(data[5]) << 16;
    result |= static_cast<uint64_t>(data[6]) << 8;
    result |= static_cast<uint64_t>(data[7]) << 0;
    return (int64_t) result;
}

答案 1 :(得分:1)

没有编译器独立的方式。您可以在GCC上使用int64_t __builtin_bswap64 (int64_t x),在MSVC上使用unsigned __int64 _byteswap_uint64(unsigned __int64 value)来交换字节顺序。你可以使用它,如果你的数组在任何地方都是一个大端(至少它不会改变其他系统上的endianess)。您必须将类型转换为64位整数。

int64_t convertEndianess(uint8_t x[])
{
    return _byteswap_uint64(*static_cast<int64_t*>(x));
}

答案 2 :(得分:-1)

使用小端,你知道字节已打包,你可以

return *reinterpret_cast<int64_t*>(&data[0]) ;