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

vector 到双字的示例(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 指令的情况下完成此操作?

最佳答案

嗯,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;
}

关于c++ - 字节到四字的 vector ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25598436/

10-11 23:11
查看更多