反序列化和byteswapping 48位整数

时间:2016-01-31 06:26:16

标签: c++ deserialization endianness

我从网络接收数据包,因此它们处于big-endian字节顺序,我需要对它们进行反序列化,然后将它们转换为x86的little-endian字节顺序。

对于标准C / C ++类型(例如下面的foo),这很简单,但如果数据包包含6字节整数bar,该怎么办?

我应该只使用带有48位位字段的pragma pack(1)吗?

#include <byteswap.h>

#pragma pack (push, 1)
typedef struct MyFooBar {
    uint64_t foo;
    uint64_t bar : 48;

    void off_wire() {
        foo = bswap_64(foo);
        //bar = bswap_48(bar); 
    }
} MyFooBar;
#pragma pack (pop)

bswap_48的快速实施是什么?这是对的吗?

typedef uint64_t uint48_t;

uint48_t bswap_48(uint48_t x) {
    return ((((x) & 0x0000000000ff) << 40) |    \
            (((x) & 0x00000000ff00) << 24) |    \
            (((x) & 0x000000ff0000) << 8)  |    \
            (((x) & 0x0000ff000000) >> 8)  |    \
            (((x) & 0x00ff00000000) >> 24) |    \
            (((x) & 0xff0000000000) >> 40));
}

0 个答案:

没有答案