版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Intel 是小端规则 Motorola 680x0 是大端规则 在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引 发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比 特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的 规则,通信双方将无法进行正确的编 / 译码从而导致通信失败。目前在各种体系 的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先从字节序说起。一、什么是字节序字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据 在内存中的存放顺序 (一个字节的数据当然就无需谈顺序的问题
2、了 )。其实大部分 人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序 中字节序才是一个应该被考虑的问题。在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和 Little-Endian,引用标准的 Big-Endian和 Little-Endian 的定义如 下:a)Little-E ndian就是低位字节排放在内存的低地址端,高位字节排放在内存 的高地址端。b)Big-E ndian就是高位字节排放在内存的低地址端,低位字节排放在内存的 高地址端。c)网络字节序:TCP/IP各层协议将字节序定义为 Big-Endian,因此TCP/IP协议中使用的字节
3、序通常称之为网络字节序。1.1 什么是高 /低地址端首先我们要知道我们C程序映像中内存的空间布局情况:在 C 专家编程中或者 Unix 环境高级编程中有关于内存空间布局情 况的说明,大致如下图:最高内存地址 0xffff栈底栈栈顶NULL (空洞 )堆 未初始化的数据统称数据段初始化的数据正文段 (代码段)最低内存地址 0x0000以上图为例如果我们在栈上分配一个un sig ned char buf4,那么这个数组变量在栈上是如何布局的呢?看下图:栈底(高地址)buf3buf2buf1buf0栈顶(低地址)1.2 什么是高 /低字节现在我们弄清了高 /低地址,接着考虑高 / 低字节。有些文章
4、中称低位字节为最低有效位,高位字节为最高有效位。如果我 们有一个32位无符号整型Ox,那么高位是什么,低位又是什么呢?其实很简 单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是 如此。就拿Ox来说,从高位到低位的字节依次是 Ox12、Ox34、Ox56 和 Ox78。高/低地址端和高/低字节都弄清了。我们再来回顾一下Big-Endian和Little-En dian的定义,并用图示说明两种字节序:以unsignedintvalue=Ox为例,分别看看在两种字节序下其存储情况,我们 可以用 unsigned char buf4来表示 value:Big-Endian:低地址存
5、放高位,如下图:栈底(高地址)buf3 (Ox78) -低位buf2 (Ox56)buf1 (Ox34)bufO (Ox12) -高位栈顶(低地址)Little-Endian:低地址存放低位,如下图:栈底(高地址)buf3 (0x12) -高位buf2 (0x34)buf1 (0x56)buf0 (0x78) -低位栈顶(低地址)二、各种 Endian2.1 Big-Endian 计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最重要字节(MSB)存放在最低端的地址上。采用这种机制的处理器有IBM3700系列、 PDP-10、Mortolora微处理器系列和绝大多数的 RISC处理器
6、。+| 0x34 |- 0x00021+| 0x12 |- 0x00020+图1 双字节数0x1234以Big-Endian的方式存在起始地址 0x00020中在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 1415+val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |+图2: Big-Endian的bit序列编码方式2.2 Little-Endian计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最不重 要字节(LSB存放在最低端的地址上
7、。采用这种机制的处理器有PDP-11、VAX、Intel 系列微处理器和一些网络通信设备。该术语除了描述多字节 存储顺序外还常常用来描述一个字节中各个比特的排放次序。+| 0x12 |- 0x00021+| 0x34| 8) | (uint16)(A) & 0x00ff) 24) | (uint32)(A) & 0x00ff00) 8) | (uint32)(A) & 0x00ff00) 8) | (uint32)(A) & 0x000ff) 24)#define ntohs htons#define ntohl htohl#else#error Either BIG_ENDIAN or LI
8、TTLE_ENDIAN must be #defined, but notboth. 网络字节顺序1、字节内的比特位不受这种顺序的影响比如一个字节10000 (或表示为十六进制80H)不管是什么顺序其内存中的 表示法都是这样。2、大于 1 个字节的数据类型才有字节顺序问题比如Byte A,这个变量只有一个字节的长度,所以根据上一条没有字节顺 序问题。所以字节顺序是 “字节之间的相对顺序 ”的意思。3、大于 1 个字节的数据类型的字节顺序有两种比如shortB,这是一个两字节的数据类型,这时就有字节之间的相对顺序 问题了网络字节顺序是 所见即所得”的顺序。而In tel类型的CPU的字节顺序与此
9、 相反。比如上面的short B=0102H十六进制,每两位表示一个字节的宽度)。所见 到的是“0102,”按一般数学常识,数轴从左到右的方向增加,即内存地址从左 到右增加的话,在内存中这个short B的字节顺序是:01 02这就是网络字节顺序。所见到的顺序和在内存中的顺序是一致的!假设通过抓包得到网络数据的两个字节流为: 01 02而相反的字节顺序就不同了,其在内存中的顺序为: 02 01如果这表示两个Byte类型的变量,那么自然不需要考虑字节顺序的问题。 如果这表示一个 short 变量,那么就需要考虑字节顺序问题。根据网络字节顺序 “所见即所得 ”的规则,这个变量的值就是: 0102假
10、设本地主机是 Intel 类型的,那么要表示这个变量,有点麻烦:定义变量shortX,字节流地址为:pt,按顺序读取内存是为x=*(short*)pt);那么X的内存顺序当然是01 02按 非“所见即所得 ”的规则,这个内存顺序和看到的一样显然是不对的,所以要把 这两个字节的位置调换。调换的方法可以自己定义,但用已经有的API还是更为方便。网络字节顺序与主机字节顺序NBO 与 HBO 网络字节顺序 NBO (Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼 容性问题。主机字节顺序( HBO, Host Byte Order):不同的机器H
11、BO不相同,与CPU设计有关计算机数据存储有两种字节优先 顺序:htonl()简述: 将主机的无符号长整形数转换成网络字节顺序。#include u_long PASCAL FAR htonl( u_long hostlong);hostlong: 主机字节顺序表达的 32 位数。注释:本函数将一个 32 位数从主机字节顺序转换成网络字节顺序。 返回值:hto nl()返回一个网络字节顺序的值。简述:将网络地址转换成 “.点”隔的字符串格式。#include in:注释:返回值:11 / 13回毒 nfohs( )nfoh_(s-Hs可讦连叢片蓉3逑n甘endif琴 c-udecssiphvv
12、oidOSHO宀 short infcharxpXk八x H oxk_k22xO H (cha3QOx)oy二护连年 xl H (chaaQOx)三0M连耳 if(ox二 hh XO)宀prinff(二big endiankryose 宀 prinffQse endiarArr)char bs八oic.aHk-if(OHHC.bo)宀 prinff (二big endiankr)八 ose 宀 prinfQse endiarAsp voidCDSGSO宀 union aword 宀inf B char bs八oic.aHOX-if(oxk2HHC.boHPI1nff(=big endiankr)八2、亠3oelseprintf(lit
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《古朴的音韵》课件
- 《以变革迎接未来》课件
- 2024高铁车站建筑分包商协议范例
- 《公司KPI提取》课件
- 浙江经贸职业技术学院《计算机高级语言程序设计(C++)》2023-2024学年第一学期期末试卷
- 2025年度售楼处物业设施设备维护保养合同2篇
- 科研设计行业安全管理工作总结
- 2024年鱼塘承包养殖产业链并购合同3篇
- 渔业养殖行业技术提升策略
- 《直流稳压》课件
- 陕西省延安市各县区乡镇行政村村庄村名居民村民委员会明细
- 复旦大学留学生(本科)汉语入学考试大纲
- 送达地址确认书(完整版)
- 试讲 关注合理营养与食品安全课件
- 2022年同等学力人员申请硕士学位日语水平统一考试真题
- 长距离输气管线工艺设计方案
- 北师大版小学五年级上册数学第六单元《组合图形的面积》单元测评培优试卷
- 用特征方程求数列的通项
- 甲醇浓度密度对照表0~40
- 四年级奥数题(一)找规律
- 会计学原理课后习题与答案
评论
0/150
提交评论