我正在尝试从u_char流指针中读取uint16_t(恰好指向ip标头)但是在获得理性结果时遇到了一些困难。
现在我跑的时候:
uint16_t len16 = *stream;
或当我运行以下内容时,如果网络和主机字节顺序之间存在差异:
uint16_t len16 = *stream;
len16 = ntohs(len16);
我没有在uint16_t中得到预期的结果。但是当我跑步时:
uint8_t total_len1, total_len2;
uint16_t total_len;
//get length1
total_len1 = *stream;
//advance pointer
stream += sizeof(uint8_t);
//get length2
total_len2 = *stream;
//advance pointer
stream += sizeof(uint8_t);
我得到的结果是我期望的total_len1和total_len2的十六进制格式。那么这里发生了什么,如何将这个值直接读入uint16_t?
答案 0 :(得分:2)
阅读*stream
将获得stream
(u_char
或uint8_t
)中一个元素的值。您想从uint16_t
中读取stream
。在这种情况下,您必须重新设置它的类型才能读取它,就像它是uint16_t
的数组一样。
uint16_t len16 = *(uint16_t *)stream;
len16 = ntohs(len16);
记忆中发生了什么:
stream
指向这个字节序列:
| byte 1 | byte 2 | byte 3 | byte 4 | byte 5 | byte 6 | ...
| uint8_t | uint8_t | uint8_t | uint8_t | uint8_t | uint8_t | ...
stream
是uint8_t
的数组,因此,通过阅读stream
元素,您一次只读取一个字节。
现在将stream
类型重新命名为uint16_t
数组,您可以成对读取形成16位值的字节:
| byte 1 | byte 2 | byte 3 | byte 4 | byte 5 | byte 6 | ...
| uint16_t | uint16_t | uint16_t | ...
使用u_char
时要小心,此类型不是C ++标准,其大小可能因编译器而异。