说是详解,实在是有愧。只不过是自己前段时间不理解,花费了点时间来总结下而已。因此此篇文章完全代表自己主观的观点^_^
关于"大小字节序"方面的知识详见BLOG前一篇文章<<大字节序 小字节序>>
那么,先理清下在网络传输里这个字节序转换的过程。假设是一台小字节序的PC机,构造好包后,以大字节(即网络流)方式传输,接着达到终端。我一开始以为传输的时候把高低字节替换,其实不是,只是一个读取值的顺序不同而已。本着这个,来看看IP头格式的定义:
标准的IP头的第一个字节里,是先版本,后首部长度,后来在很多代码里看到这两个是相反的。当时就很纳闷。比如这个定义
#if defined(WORDS_BIGENDIAN)
u_int8_t ip_version: 4,
/* 版本 */
ip_header_length: 4;
/* 首部长度 */
#else
u_int8_t ip_header_length: 4,
/* 首部长度 */
ip_version: 4;
/* 版本 */
#endif
那么就从主机-网络-主机这个流程走一遍;
这是我们在主机上构造的一个字节数据:
首部长度:4 版本:4
高地址 低地址
经过网络时,大字节的读取是从低到高,刚好符合,如果我们这样按规范构造
版本:4 首部长度:4
高地址 低地址
经过网络时,大字节的读取是从低到高,刚好是相反的
而在API辅助方面只有atohs atohl两种16位和32位的转换,对8位的无能为力。当然也可以自己构造一个
那么再举个例子,IP字段第二个字节的后16位是
3位标志位 13位偏移
u_int16_t ip_off;
假设我要把第二位标志的BIT设为1,那么可以直接这样
ip_off = 0x40
可以这样来理解,假设这是主机中二进制的排列
0010 0000 0000 0000
高 低
那么在网络传输时,网络层是这样读的,从低位的右三位为标志符,剩下都是偏移,那么实际上我们要设置的是
0000 0000 0100 0000
即0x40
分享到:
相关推荐
### Oracle数据库字段类型详解 #### 字符串类型 ...接下来的部分将继续介绍日期时间数据类型、大型对象(LOB)数据类型、RAW 和 LONGRAW 数据类型、ROWID 和 UROWID 数据类型以及特殊数据类型等内容。
### Python学习笔记知识点详解 #### 数据类型与变量 在Python编程中,理解基本的数据类型及其操作至关重要。数据类型包括但不限于整型(`int`)、浮点型(`float`)、布尔型(`bool`)以及字符串(`str`)。变量则...
### Python 2.X 与 3.X 版本的区别详解 Python作为一种广泛使用的高级编程语言,自1991年首次发布以来,经历了多个版本的更迭,其中最显著的两个大版本为Python 2.X 和 Python 3.X。本文将深入探讨这两个版本之间的...
- `type`参数:定义了套接字的通信类型,如SOCK_STREAM(TCP连接,提供有序、可靠的双向字节流)和SOCK_DGRAM(UDP连接,无连接状态的消息)。每种类型都有其特定的用途,例如SOCK_RAW用于原始网络协议访问,而SOCK...
当需要重置 raw bytes 数据以便重新写入新数据时使用此指令。 **参数说明:** - **raw_bytes_data**:目标 raw bytes 数据。 **示例代码:** ```rapid ClearRawBytes raw_bytes_data:=myRawData; ``` --- ##### ...
2. **非规范模式(Raw Mode)**:这种模式下,所有的缓冲和编辑功能都被关闭。用户按下的每个字符都会立即发送到程序,而不会进行任何处理。这使得开发者能够更好地控制输入过程,但同时也意味着程序员需要自己实现...