在C++中使用std::byteswap成员位域的正确方法是什么

djmepvbi  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(146)

我需要将通过网络作为原始字节的结构字段从大端字节转换为小端字节。
考虑以下结构:

struct [[gnu::packed]] Header {
    std::uint8_t magic_value:4;
    std::uint8_t offset:4;
    std::uint8_t flag1:1;
    std::uint8_t flag2:1;
    std::uint8_t flag3:1;
    std::uint8_t flag4:1;
    std::uint8_t flag5:1;
    std::uint8_t flag6:1;
    std::uint8_t flag7:1;
    std::uint8_t flag8:1;
};

将反序列化的大端Header转换为小端Header的正确方法是什么?

1zmg4dgp

1zmg4dgp1#

可以使用std::bit_cast

const auto big_endian_data = std::bit_cast<std::uint16_t>(input);
const auto small_endian_data = std::byteswap(big_endian_data);
auto header = std::bit_cast<Header>(small_endian_data);

相关问题