我从网络接收数据包,因此它们处于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));
}