从比特流中读取uint16_t

时间:2013-11-16 22:09:35

标签: c++ header stream ip

我正在尝试从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?

1 个答案:

答案 0 :(得分:2)

阅读*stream将获得streamu_charuint8_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 | ...

streamuint8_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 ++标准,其大小可能因编译器而异。