端序和位域的关系
来源:互联网 发布:网络病毒有哪些 编辑:程序博客网 时间:2024/05/15 08:48
端序包括字节序和位序。
结论a:
struct定义字段按照从内存低位地址到高位地址排列。
简单回顾大小尾:
大尾序符合人们习惯,数的高位分布在内存中的低位地址。
小尾序相反。
字节序主要用在网络通讯。
使用场景:当本地的多字节整数如short或long,需要发送到网络。
不同的设备可能使用不同的字节序(包括大尾序、小尾序等,具体取决于CPU类型),导致多字节整形变量在内存中排列的顺序不同, 直接发送到网络,导致字节序不同的设备发送同样的内容产生不同的效果。所以网络发送前,整形变量需要进行一次转换,转换为网络序(网络序为大尾序)。
比如,实际值0x12345678,在大尾序中,内存从低位地址到高排地址列顺序为0x12345678,小尾序中从低到高为0x78563412。它们都是以字节为基本单元的。
除了字节序,还有位序。如果只是从事上层开发,应该不用关注到位序。
不过如果刚看过linux中tcp.h、ip.h的定义并需要使用的同学,可能还有疑问。
位序和字节序一样,大尾在内存中的排列符合人类习惯,在内存中高位数值分布在低位地址(或许不应该这么叫),小尾正好相反。
结论b:
对于发送同一个字节,大尾和小尾在内存中分布是不同的,但是能达到同样的效果,底层在发送时,发送的内容取决于字节的实际值,和字节内的内存中顺序无关。
下面给出linux的ip.h文件中的一部分:
struct iphdr {#ifdef __LITTLE_ENDIAN_BITFIELD __u8 ihl:4, version:4;#elif defined (__BIG_ENDIAN_BITFIELD) __u8 version:4, ihl:4;#else#error "Please fix <asm/byteorder.h>"#endif __u8 tos; __be16 tot_len; __be16 id; __be16 frag_off; __u8 ttl; __u8 protocol; __u16 check; __be32 saddr; __be32 daddr;};
先给出结论:
结论c:
开发者可以不用关心位序相关的内容,直接使用相关字段即可。
下面简单验证上面的结论。
已知struct中的字段排列为由低位到高位,令 version=1,ihl=2,
在大尾设备上,根据上面结构体,内存中的内容为:0001 0002,实际值为0001 0002
在小尾设备上,如果version字段在前,由结论a,得到内存中的内容为:1000 2000,实际值为0002 1000
在小尾设备上,根据上面结构体,内存中的内容为:2000 1000,实际值为0001 0002
可以看出,第三组与第一组的实际值吻合,由结论b,两个字节内容相同即可产生相同的报文,得知验证成功。
- 端序和位域的关系
- 字和字节和位的关系
- 字节和位和k的关系
- 字和字节和位的关系
- 位,字和字节的关系电脑知识
- C位域与大小端字节序 间关系
- 64位CPU,64位操作系统,和64位应用程序三者之间的关系
- 模运算%和位与运算&之间的关系
- 原码、反码、补码、和位非的关系
- Java| Java中字节Byte和位Bit的关系
- 关于笔记本操作系统32位和64位与内存大小的关系
- 电脑内存与操作系统32位和64位的关系及两者区别
- C语言变量长度在32位和64位处理器上的关系
- 浅谈32位和64位操作系统与内存的关系
- 位与字节的关系
- 字,字节,位的关系
- 字、字节、位的关系
- 位操作 << >> & | ^ ~和 关系操作符
- R语言-回归分析
- logrotate
- Boost智能指针——scoped_ptr
- java好难
- 【进阶android】ListView源码分析——适配器及观察者模式
- 端序和位域的关系
- 黑马day05 Cookie技术入门&记录上次访问的时间
- Android实战页面内容加载动画
- Ubuntu:安装MySql经GUI客户端MySql-Workbench
- Noise Reduction Using a Median Filter(噪声去除的中值滤波方法)
- Hashtable 和 HashMap 做为 Map 的基本特性
- validator
- R语言-循环语句
- android之修改系统自带ProgressDialog样式