说是详解,实在是有愧。只不过是自己前段时间不理解,花费了点时间来总结下而已。因此此篇文章完全代表自己主观的观点^_^
关于"大小字节序"方面的知识详见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
分享到:
相关推荐
"字节序与位序详解" 字节序(Byte Order)和位序(Bit Order)是计算机系统中两个重要的概念,它们决定了计算机系统如何存储和处理多字节整数。在本文中,我们将详细介绍字节序和位序的定义、类型、特点以及在...
构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同) 首先说一下一个C++的空类,编译器会加入哪些默认的成员函数 默认...
在C++编程中,拷贝构造函数和赋值运算符是两种重要的成员函数,它们用于处理对象间的值复制。这篇文章将深入探讨这两种机制的区别、调用条件以及深拷贝和浅拷贝的概念。 拷贝构造函数是一种特殊的构造函数,它接受...
在C++编程中,正确地管理类的构造函数、拷贝构造函数、析构函数和赋值函数是创建健壮、无内存泄漏程序的关键。接下来将详细介绍如何为自定义的String类编写这些函数,并通过实例来加深理解。 首先,我们定义一个...
### C++拷贝构造函数与赋值操作详解 在C++编程中,拷贝构造函数与赋值操作是实现类的拷贝管理的关键机制。它们主要用于处理类的对象之间的拷贝和复制过程,尤其是在处理含有动态分配内存的类时尤为重要。 #### ...
- **移动语义**:C++11引入了移动构造函数和移动赋值运算符,它们在资源转移而非复制时更有效率。然而,复制构造函数仍然是基础,因为即使在有移动语义的情况下,某些场景仍然需要复制。 理解并正确实现复制构造...
一、QString赋值给char* 例如: QString qstr; char *str = qstr.toLatin1().data();//这样便把qstr中的值传给了str 二 、char [] 赋值给string char str[32]; string str2(str);//这样便把str中的值传给...
复制构造函数和复制赋值运算符 从 C++ 11 中开始,该语言支持两种类型的分配:复制赋值和移动赋值。 在本文中,“赋值”意味着复制赋值,除非有其他显式声明。 赋值操作和初始化操作都会导致对象被复制。 赋值:在将...
您可能感兴趣的文章:浅谈c++构造函数问题,初始化和赋值问题详解C++ 拷贝构造函数和赋值运算符详解C++中对构造函数和赋值运算符的复制和移动操作C++中复制构造函数和重载赋值操作符总结深入C++中构造函数、拷贝构造...
### 阻塞赋值与非阻塞赋值详解 #### 一、引言 在数字电路设计领域,特别是使用硬件描述语言(如Verilog HDL)进行设计时,理解和掌握阻塞赋值与非阻塞赋值的概念至关重要。这两种赋值方式不仅直接影响到电路的行为...
RAW格式图像要比JEPG格式图像成像更加扎实一些,其在画面的清晰度和细腻程度上都有所提高,并且在画面的细节表达上也更加丰富了一些。 最后,打开方式不同。大部分人在打开JEPG格式图像时从来都没有过考虑打开方式...
字节对齐详解 在计算机科学中,字节对齐是一种重要的概念,它对程序的性能和内存使用产生了巨大的影响。字节对齐是指在计算机内存中,对各种类型的数据按照一定的规则排列,以便提高访问效率和减少内存占用。 字节...
总的来说,Golang通过提供`ipv4`和`udp`包,使得开发人员能够方便地利用原始套接字构造和发送自定义的UDP包,这对于网络编程爱好者和专业人士来说,是一个强大的工具,能够满足特定的网络通信需求。然而,使用原始套...
通过定义适当的构造函数,可以确保对象在创建时就处于预期的状态,而赋值运算符重载则保证了对象的赋值操作符合预期。在上述代码中,`Complex`类展示了这些构造函数的不同用途,包括无参数构造函数、带有参数的构造...
微信小程序两种为对象属性赋值的方式 对应config.wxml 阶段一 对应config.js data:{ //定义对象 configs:{} } //方式一 switchChange:function(e){ //为对象的某一属性赋值 configs.config1={ }; ...
### C++内存中字节对齐问题详解 #### 一、什么是字节对齐,为什么要对齐? 在C++及其它编程语言中,字节对齐(Byte Alignment)是指数据在内存中的排列方式,它遵循特定的规则,使得数据结构中的每个元素能够在其...
在计算机图形学和图像处理领域,RAW文件是一种常见的未经处理的数字图像格式,它通常直接从相机的传感器中获取数据,未经任何色彩空间转换或压缩。这样的文件包含了最原始的像素信息,为后期处理提供了最大的灵活性...