说是详解,实在是有愧。只不过是自己前段时间不理解,花费了点时间来总结下而已。因此此篇文章完全代表自己主观的观点^_^
关于"大小字节序"方面的知识详见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++编程中,正确地管理类的构造函数、拷贝构造函数、析构函数和赋值函数是创建健壮、无内存泄漏程序的关键。接下来将详细介绍如何为自定义的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中的值传给...
RAW格式图像要比JEPG格式图像成像更加扎实一些,其在画面的清晰度和细腻程度上都有所提高,并且在画面的细节表达上也更加丰富了一些。 最后,打开方式不同。大部分人在打开JEPG格式图像时从来都没有过考虑打开方式...
字节对齐详解 在计算机科学中,字节对齐是一种重要的概念,它对程序的性能和内存使用产生了巨大的影响。字节对齐是指在计算机内存中,对各种类型的数据按照一定的规则排列,以便提高访问效率和减少内存占用。 字节...
4. 程序效率:字节对齐可能影响程序的大小和运行速度,因此需要在性能和内存使用之间找到平衡。 了解字节对齐后,开发者可以更好地优化代码,避免不必要的内存访问开销,提高程序运行效率。在设计数据结构和编写...
在C++编程中,理解和掌握构造函数和赋值运算符的复制与移动操作至关重要,因为它们直接影响对象的创建、初始化以及值的传递。本文将详细阐述这些概念。 首先,复制构造函数是C++中用于创建新对象的一个特殊构造函数...
通过定义适当的构造函数,可以确保对象在创建时就处于预期的状态,而赋值运算符重载则保证了对象的赋值操作符合预期。在上述代码中,`Complex`类展示了这些构造函数的不同用途,包括无参数构造函数、带有参数的构造...
微信小程序两种为对象属性赋值的方式 对应config.wxml 阶段一 对应config.js data:{ //定义对象 configs:{} } //方式一 switchChange:function(e){ //为对象的某一属性赋值 configs.config1={ }; ...
在计算机图形学和图像处理领域,RAW文件是一种常见的未经处理的数字图像格式,它通常直接从相机的传感器中获取数据,未经任何色彩空间转换或压缩。这样的文件包含了最原始的像素信息,为后期处理提供了最大的灵活性...
当我们创建一个类的实例时,构造函数会被自动调用,确保对象在使用前处于正确的初始状态。下面将详细解释构造函数的种类及其作用。 1. 无参数构造函数:这是编译系统默认提供的一种构造函数,如果类中没有定义任何...
内容概要:本文深入讲解了Python中输入输出的基础操作如使用input()和print()函数的方法以及多种字符串格式化的技巧,同时也介绍了高级赋值语句的应用场景,并提供了实际示例——购物车程序来巩固相关知识点。...
### BMP文件格式详解 BMP(Bitmap)文件格式是一种由微软设计并被广泛应用于Windows操作系统中的图像文件格式。因其能够无损地存储图像像素数据,成为获取RAW数据的关键途径之一。Windows图形用户界面(GUI)及其...
本文将详细解析三种常见的背包问题:01背包、完全背包和多重背包。 首先,我们来了解01背包问题。01背包问题的名字来源于每个物品只能选择放入背包(1)或不放入(0)。问题定义如下:给定n个物品,每个物品有自己...
C++ String 详解的构造函数和析构函数有多种形式,包括无参构造函数、拷贝构造函数、字符串构造函数等。用户可以根据需要选择合适的构造函数来创建字符串对象。 C++ String 详解的操作函数有很多,如赋值、比较、...