从位流读取uint16_t
reading uint16_t from bit stream
我正在尝试从u_char流指针(恰好指向 ip 标头)读取uint16_t,但很难获得合理的结果。
现在当我运行时:
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中?
读取
*stream
将获得stream
的一个元素的值(u_char
或uint8_t
)。您想从stream
中读取uint16_t
。在这种情况下,您将不得不重新转换其类型以将其读取为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++标准,其大小可能因编译器而异。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 一种在C++中读取TXT配置文件的简单方法