Union and endianness without htonl/ntohl
我想解析我收到的 TCP 包的标头。
假设这是一个标题结构:
1 2 3 | (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 平台上以有效的方式解析这个头文件。我为此标题创建了下一个联合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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; |
接下来我尝试将上面的包复制到我的
如何使用单独的字节序来避免这个问题?
Boost 提供了一个专用于字节序的库:
http://www.boost.org/doc/libs/1_61_0/libs/endian/doc/index.html
例如:
1 | boost::endian::big_to_native_inplace(bar.field.command); |
或安迪G:
1 | std::cout << boost::endian::endian_reverse(bar.field.token) << std::endl; |
注意:这个库有 3 种处理字节序的方法,你需要花时间选择适合你的情况。