你的位置:首页 > Java教程

[Java教程]通讯协议之——字节序


最近有接触通讯协议有碰到字节序,记得上学的时候有说过不过太久了不怎么记得了,现在我在这里说说字节序; 

   我们都知道计算机存储数据的时候都是把数据转换成字节进行存储,而日常我们的程序或存储的数据通常都是由多个字节组成的,而不同的计算机或设备存储的规则又不一致,导致我们在多计算机、设备间传输数据时就要了解设备的字节存储(字节序)规则是怎样的,这就是我们要了解字节序的原因,在做网络编程,游戏编程时这是必须清楚的知识;

   比如:在我们使用的计算机编程语言中就有各种数据类型: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),否则一端接收到的数据将有可能为无效数据。

 文章首发地址:Solinx
http://www.solinx.co/archives/164