2017-06-02 48 views
3

我想解析我收到的TCP包的头文件。没有htonl/ntohl的联盟和排序

假设这是一个头结构:

(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这个问题?

回答

4

升压提供了一种专用于字节序库:

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种方式处理排序,你需要花时间选择适合你的东西r案件。

+1

很高兴展示一个例子,OP的问题可以如何用该库来解决。 –

+1

'std :: cout << boost :: endian :: endian_reverse(bar.field.token)<< std :: endl;' – AndyG