`

详解大小字节序和构造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++ 拷贝构造函数和赋值运算符

    在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中的值传给...

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

    复制构造函数和复制赋值运算符 从 C++ 11 中开始,该语言支持两种类型的分配:复制赋值和移动赋值。 在本文中,“赋值”意味着复制赋值,除非有其他显式声明。 赋值操作和初始化操作都会导致对象被复制。 赋值:在将...

    C++ 赋值构造函数注意点介绍

    您可能感兴趣的文章:浅谈c++构造函数问题,初始化和赋值问题详解C++ 拷贝构造函数和赋值运算符详解C++中对构造函数和赋值运算符的复制和移动操作C++中复制构造函数和重载赋值操作符总结深入C++中构造函数、拷贝构造...

    阻塞赋值与非阻塞赋值详解.pdf

    ### 阻塞赋值与非阻塞赋值详解 #### 一、引言 在数字电路设计领域,特别是使用硬件描述语言(如Verilog HDL)进行设计时,理解和掌握阻塞赋值与非阻塞赋值的概念至关重要。这两种赋值方式不仅直接影响到电路的行为...

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

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

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

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

    golang如何利用原始套接字构造UDP包详解

    总的来说,Golang通过提供`ipv4`和`udp`包,使得开发人员能够方便地利用原始套接字构造和发送自定义的UDP包,这对于网络编程爱好者和专业人士来说,是一个强大的工具,能够满足特定的网络通信需求。然而,使用原始套...

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

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

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

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

    c++内存中字节对齐问题详解

    ### C++内存中字节对齐问题详解 #### 一、什么是字节对齐,为什么要对齐? 在C++及其它编程语言中,字节对齐(Byte Alignment)是指数据在内存中的排列方式,它遵循特定的规则,使得数据结构中的每个元素能够在其...

    vc raw 源代码

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

Global site tag (gtag.js) - Google Analytics