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; |
接下来我尝试将上面的包复制到我的
如何使用单独的字节序来避免这个问题?
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 种处理字节序的方法,你需要花时间选择适合你的情况。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/268937.html