`

详解大小字节序和构造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进行高低位相反的读取

相关推荐

    字节序与位序

    "字节序与位序详解" 字节序(Byte Order)和位序(Bit Order)是计算机系统中两个重要的概念,它们决定了计算机系统如何存储和处理多字节整数。在本文中,我们将详细介绍字节序和位序的定义、类型、特点以及在...

    详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同) 首先说一下一个C++的空类,编译器会加入哪些默认的成员函数 默认...

    详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数

    在C++编程中,正确地管理类的构造函数、拷贝构造函数、析构函数和赋值函数是创建健壮、无内存泄漏程序的关键。接下来将详细介绍如何为自定义的String类编写这些函数,并通过实例来加深理解。 首先,我们定义一个...

    C++拷贝构造函数和赋值操作

    ### C++拷贝构造函数与赋值操作详解 在C++编程中,拷贝构造函数与赋值操作是实现类的拷贝管理的关键机制。它们主要用于处理类的对象之间的拷贝和复制过程,尤其是在处理含有动态分配内存的类时尤为重要。 #### ...

    C++复制构造函数详解

    - **移动语义**:C++11引入了移动构造函数和移动赋值运算符,它们在资源转移而非复制时更有效率。然而,复制构造函数仍然是基础,因为即使在有移动语义的情况下,某些场景仍然需要复制。 理解并正确实现复制构造...

    QString和char以及string之间的赋值详解

    一、QString赋值给char*  例如: QString qstr;  char *str = qstr.toLatin1().data();//这样便把qstr中的值传给了str 二 、char [] 赋值给string  char str[32];  string str2(str);//这样便把str中的值传给...

    从零开始玩单反相机参数之RAW格式详解[汇编].pdf

    RAW格式图像要比JEPG格式图像成像更加扎实一些,其在画面的清晰度和细腻程度上都有所提高,并且在画面的细节表达上也更加丰富了一些。 最后,打开方式不同。大部分人在打开JEPG格式图像时从来都没有过考虑打开方式...

    字节对齐详解,真的很有用地啊

    字节对齐详解 在计算机科学中,字节对齐是一种重要的概念,它对程序的性能和内存使用产生了巨大的影响。字节对齐是指在计算机内存中,对各种类型的数据按照一定的规则排列,以便提高访问效率和减少内存占用。 字节...

    字节对齐详解

    4. 程序效率:字节对齐可能影响程序的大小和运行速度,因此需要在性能和内存使用之间找到平衡。 了解字节对齐后,开发者可以更好地优化代码,避免不必要的内存访问开销,提高程序运行效率。在设计数据结构和编写...

    详解C++中对构造函数和赋值运算符的复制和移动操作

    在C++编程中,理解和掌握构造函数和赋值运算符的复制与移动操作至关重要,因为它们直接影响对象的创建、初始化以及值的传递。本文将详细阐述这些概念。 首先,复制构造函数是C++中用于创建新对象的一个特殊构造函数...

    c++类构造函数详解_.docx

    通过定义适当的构造函数,可以确保对象在创建时就处于预期的状态,而赋值运算符重载则保证了对象的赋值操作符合预期。在上述代码中,`Complex`类展示了这些构造函数的不同用途,包括无参数构造函数、带有参数的构造...

    微信小程序 两种为对象属性赋值的方式详解

    微信小程序两种为对象属性赋值的方式 对应config.wxml 阶段一 对应config.js data:{ //定义对象 configs:{} } //方式一 switchChange:function(e){ //为对象的某一属性赋值 configs.config1={ }; ...

    vc raw 源代码

    在计算机图形学和图像处理领域,RAW文件是一种常见的未经处理的数字图像格式,它通常直接从相机的传感器中获取数据,未经任何色彩空间转换或压缩。这样的文件包含了最原始的像素信息,为后期处理提供了最大的灵活性...

    C++构造函数详解及显式调用构造函数.doc

    当我们创建一个类的实例时,构造函数会被自动调用,确保对象在使用前处于正确的初始状态。下面将详细解释构造函数的种类及其作用。 1. 无参数构造函数:这是编译系统默认提供的一种构造函数,如果类中没有定义任何...

    详解Python中的输入输出操作及高级赋值技巧(包含详细的完整的程序和数据)

    内容概要:本文深入讲解了Python中输入输出的基础操作如使用input()和print()函数的方法以及多种字符串格式化的技巧,同时也介绍了高级赋值语句的应用场景,并提供了实际示例——购物车程序来巩固相关知识点。...

    BMP文件格式详解

    ### BMP文件格式详解 BMP(Bitmap)文件格式是一种由微软设计并被广泛应用于Windows操作系统中的图像文件格式。因其能够无损地存储图像像素数据,成为获取RAW数据的关键途径之一。Windows图形用户界面(GUI)及其...

    背包之01背包、完全背包、多重背包详解.

    本文将详细解析三种常见的背包问题:01背包、完全背包和多重背包。 首先,我们来了解01背包问题。01背包问题的名字来源于每个物品只能选择放入背包(1)或不放入(0)。问题定义如下:给定n个物品,每个物品有自己...

    C++ String 详解 C++ String 详解

    C++ String 详解的构造函数和析构函数有多种形式,包括无参构造函数、拷贝构造函数、字符串构造函数等。用户可以根据需要选择合适的构造函数来创建字符串对象。 C++ String 详解的操作函数有很多,如赋值、比较、...

Global site tag (gtag.js) - Google Analytics