通讯协议之——字节序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通讯协议之——字节序
最近有接触通讯协议有碰到字节序,记得上学的时候有说过不过太久了不怎么记得了,现在我在这⾥说说字节序;
我们都知道计算机存储数据的时候都是把数据转换成字节进⾏存储,⽽⽇常我们的程序或存储的数据通常都是由多个字节组成的,⽽不同的计算机或设备存储的规则⼜不⼀致,导致我们在多计算机、设备间传输数据时就要了解设备的字节存储(字节序)规则是怎样的,这就是我们要了解字节序的原因,在做⽹络编程,游戏编程时这是必须清楚的知识;
⽐如:在我们使⽤的计算机编程语⾔中就有各种数据类型:byte,int,short,long等等
⽽a byte由⼋个bit组成,⼀个short由两个字节组成,⼀个int由四个字节组成等,⽽我们对byte、short、int等这些数据进⾏存储或通过⽹络传输时需要把他转换为byte进⾏存储或传输,这时把⼀个int转为byte数组时的数据存储顺序就成为:字节顺序。
例如: int 类型数据:33818120,对应的⼗六进制为:0x02040608
转成byte数组后byte数据为:byte[4]= {02,04,06,08}
byte数组中的数据的顺序就称为:字节顺序
为什么在存储或⽹络编程的时候要关注字节顺序呢?在⽹络编程中⽐如我们发送的数据为:byte[4]= {02,04,06,08}⽽接收端不清楚我们的字节顺序⽽使⽤与我们相反的字节顺序接收数据:byte[4]= {08,06,04,02}这就导致接收端收到的数据变成了错误⽆效的数据,我们发送的数据为:33818120,⽽现在由于他不知道我们的字节顺序导致接收到的数据为:134611970;
在英⽂上这个词为endian,有翻译为端序、字节序等等,我这⾥称为【字节序】,据说endian这个词的由来源⾃18世纪的⼀本⼩说《格列佛游记》,⼩说中:“吃鸡蛋时是从鸡蛋较⼤的⼀端打破鸡蛋还是从鸡蛋较⼩的⼀端打”,还以为这事有了叛乱;1980年⼀个⽹络协议的开发者在其著名的论⽂《On Holy Wars and a Plea for Peace》中⾸次使⽤了该词。
从字⾯上理解字节序为:字节存储顺序,上⾯我们也说过实际上字节序就是程序对象、数据存储在计算机上的顺序,⼀般字节序分为:⼩字节序(Little-Endian)、⼤字节序(Big-Endian)、混合字节序(Mixed-Endian)三种,混合字节序⽤得⽐较少,TCP/IP各层协议使⽤的是⼤字节序(Big-Endian)我们也称为⽹络字节序;
有块地址空间四个字节长度如下:
例如:⼗进制数 33818120 ⼗六进制为:0x02040608
在地址空间中以⼤字节序、⼩字节序存储为如下格式:
⼤字节序(Little-Endian)在地址空间中存储格式:
⼩字节序(Big-Endian)在地址空间中存储格式:
⼤字节序:数据的⾼位存储在地址空间的低位,数据的低位存储在地址空间⾼位
⼩字节序:数据的低位存储在地址空间的低位,数据的⾼位存储在地址空间⾼位
在java中使⽤的是⼤字节序(Big-Endian)存储数据,⽽C/C++存储则与CPU相关,所以在⽹络编程中⼀端为java开发的程序,⼀端为C/C++中的程序在传输的时候需要对传输的数据字节序(Endian)进⾏统⼀,都是⽤⼩字节序(Little-Endian)或⼤字节序(Big-Endian),否则⼀端接收到的数据将有可能为⽆效数据。