我想解析我收到的TCP包的标题。
假设这是一个标题结构:
(2 bytes for commands) + (2 bytes for token) + (4 bytes for data length)
Example of package: 0x01 0x02 0x12 0x34 0x00 0x00 0x00 0x05
There 0x0102 is command, 0x1234 is token and 0x000005 is data length.
我想在Windows平台上以有效的方式解析此标头。我为这个标题创建了下一个联盟:
typedef union
{
struct
{
uint16_t command;
uint16_t token;
uint32_t data_length;
} field;
char bytes[8];
} MyHeader_t;
MyHeader_t bar;
read_8_bytes(bar.bytes);
std::cout << bar.fields.token << std::endl;
接下来,我尝试将上面的包复制到我的bytes
数组中。但是网络包具有大的字节顺序,并且PC尝试将字段读取为小字节序。因此,我的token
字段等于0x3412
(而不是0x1234)。
如何使用单独的endiannes避免此问题?
答案 0 :(得分:4)
Boost提供了一个专门用于endianess的库:
http://www.boost.org/doc/libs/1_61_0/libs/endian/doc/index.html
例如:
boost::endian::big_to_native_inplace(bar.field.command);
或者是AndyG:
std::cout << boost::endian::endian_reverse(bar.field.token) << std::endl;
注意:此库有3种处理字节序的方法,您需要花时间选择适合您案例的方法。