`

详解大小字节序和构造raw包时的一些常见赋值

阅读更多
说是详解,实在是有愧。只不过是自己前段时间不理解,花费了点时间来总结下而已。因此此篇文章完全代表自己主观的观点^_^

关于"大小字节序"方面的知识详见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

2
1
分享到:
评论
1 楼 lin_style 2008-07-08  
u_int16_t ip_off;
如果是分成8位的话就这样设置
u_int8_t ip_off_1_offst:1
u_int8_t ip_off_1_falg:3
u_int8_t ip_off_2_offst,

这里是为了怕和16读的时候搞混。如果你单独设成8位的,并不会影响和他相邻8位的先后级读取。它只是会针对比如一个单位量里的读取 比如需要设定int,如果你换成两个u_int16_t,他们它仅对每个u_int16_t进行高低位相反的读取

相关推荐

    Oracle数据库字段类型详解

    ### Oracle数据库字段类型详解 #### 字符串类型 ...接下来的部分将继续介绍日期时间数据类型、大型对象(LOB)数据类型、RAW 和 LONGRAW 数据类型、ROWID 和 UROWID 数据类型以及特殊数据类型等内容。

    python学习笔记ing

    ### Python学习笔记知识点详解 #### 数据类型与变量 在Python编程中,理解基本的数据类型及其操作至关重要。数据类型包括但不限于整型(`int`)、浮点型(`float`)、布尔型(`bool`)以及字符串(`str`)。变量则...

    python版本区别

    ### Python 2.X 与 3.X 版本的区别详解 Python作为一种广泛使用的高级编程语言,自1991年首次发布以来,经历了多个版本的更迭,其中最显著的两个大版本为Python 2.X 和 Python 3.X。本文将深入探讨这两个版本之间的...

    《通信协议软件设计》作业三(2020)1

    - `type`参数:定义了套接字的通信类型,如SOCK_STREAM(TCP连接,提供有序、可靠的双向字节流)和SOCK_DGRAM(UDP连接,无连接状态的消息)。每种类型都有其特定的用途,例如SOCK_RAW用于原始网络协议访问,而SOCK...

    机器人指令手册ABB

    当需要重置 raw bytes 数据以便重新写入新数据时使用此指令。 **参数说明:** - **raw_bytes_data**:目标 raw bytes 数据。 **示例代码:** ```rapid ClearRawBytes raw_bytes_data:=myRawData; ``` --- ##### ...

    Linux 下 Python 实现按任意键退出的实现方法

    2. **非规范模式(Raw Mode)**:这种模式下,所有的缓冲和编辑功能都被关闭。用户按下的每个字符都会立即发送到程序,而不会进行任何处理。这使得开发者能够更好地控制输入过程,但同时也意味着程序员需要自己实现...

Global site tag (gtag.js) - Google Analytics