网络字节顺序、大端法、小端法_第1页
网络字节顺序、大端法、小端法_第2页
网络字节顺序、大端法、小端法_第3页
网络字节顺序、大端法、小端法_第4页
网络字节顺序、大端法、小端法_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、网络字节顺序、大端法、小端法 分类: j2se 2006-03-23 23:53 3213人阅读 评论(1) 收藏 举报       在国内的4种短信协议的协议头部分,都定义了4个字节长度的message length字段,字段的数据类型为无符号整形(也就是说,这个字段的范围是0216-1);而在java语言中,没有无符号整形这种数据类型(如果用int类型来表示,由于java中int型是有符号数,则会发送溢出),我设想将message length存入long类型中,将数字的大小控制在0216-1范围之内,当超过此范围归零重新开始。在网络传输时

2、,将long类型先转化为byte数组,步骤如下:long l;byte b;b0=(byte)(l>>>24);b1=(byte)(l>>>16);b2=(byte)(l>>>8);b3=(byte)(l);此时,b中就按照网络字节顺序(大端法,即l的高位数据存放在byte的低位地址,因为地址是从低向高发展的)存放着4个bytes的数据使用OutputStream的public void write(byte b,int off,int len)方法来向Socket写字节流,写byte0至byte3的字节。&#

3、160;java.io Class OutputStreamwritepublic abstract void write(int b) throws IOExceptionWrites the specified byte to this output stream. The general contract for write is that one byte is written to the output stream. The byte to be written is the eight low-order bits of the argument b. The 24 h

4、igh-order bits of b are ignored. Subclasses of OutputStream must provide an implementation for this method.  Parameters: b - the byte. Throws: IOException - if an I/O error occurs. In particular, an IOException may be thrown if the output stream has been closed.writepublic void write(byte 

5、b, int off, int len) throws IOExceptionWrites len bytes from the specified byte array starting at offset off to this output stream. The general contract for write(b, off, len) is that some of the bytes in the array b are written to the output stream in order; element boff is the first byte

6、 written and boff+len-1 is the last byte written by this operation. The write method of OutputStream calls the write method of one argument on each of the bytes to be written out. Subclasses are encouraged to override this method and provide a more efficient implementation. If b is null, a NullPoint

7、erException is thrown. If off is negative, or len is negative, or off+len is greater than the length of the array b, then an IndexOutOfBoundsException is thrown.  Parameters: b - the data. off - the start offset in the data. len - the number of bytes to write. Throws: IOException - if an I/O er

8、ror occurs. In particular, an IOException is thrown if the output stream is closed.关于网络、主机字节顺序的文章  主机和网络字节序的转换最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换。字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序,根据他们所处的位置我们分别称为主机节序和网络字节序。通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换为网络字节序,拆包的时候要将网络字节序转换为主机字节序。原

9、以为还要自己写函数,其实网络库已经提供了。主机到网络:short/int/long IPAddress.HostToNetworkOrder(short/int/long)网络到主机:short/int/long IPAddress.NetworkToHostOrder(short/int/long) 主机字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处,如:int x=1; /此时x为主机字节序:1000 低位到高位int y=65536 /此时y为主机字节序:0010 低位到高位我们通过主机到网络字节序的转换函数分别对x和y进行转换得到他们对应的网络字节序值,网

10、络节序是高字节数据存放在低地址处,低字节数据存放在高地址处,如:int m=IPAddress.HostToNetworkOrder(x);/此时m为主机字节序:0001 高位到低位int n=IPAddress.HostToNetworkOrder(y);/此时n为主机字节序:0100 高位到低位 经过转换以后,我们就可以通过bytebtValue=BitConverter.GetBytes(m);得到一个长度为4的byte数组,然后将这个数组设置到报文的相应位置发送出去即可。同样,收到报文后,可以将报文按域拆分,得到btValue,使用int m=BitConverter.ToI

11、nt32(btValue,0);/从btValue的第0位开始转换得到该域的值,此时还不能直接使用,应该再用网络到主机字节序的转换函数进行转换:int x=IPAddress.NetworkToHostOrder(m);这时得到的x才是报文中的实际值。-也谈字节序问题一次Sun SPARC到Intel X86的平台移植让我们的程序遭遇了“字节序问题”,既然遇到了也就不妨深入的学习一下。一、字节序定义字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网

12、络程序中字节序才是一个应该被考虑的问题。在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。其实我在第一次看到这个定义时就很糊涂,看了几个例子后也很是朦胧。什么高/低

13、地址端?又什么高低位?翻阅了一些资料后略有心得。二、高/低地址与高低字节首先我们要知道我们C程序映像中内存的空间布局情况:在C专家编程中或者Unix环境高级编程中有关于内存空间布局情况的说明,大致如下图:- 最高内存地址 0xffffffff | 栈底 . .              栈 .  栈顶- | |/|/NULL (空洞) /|/ | 

14、|-                堆-未初始化的数据-(统称数据段)初始化的数据-正文段(代码段)- 最低内存地址 0x00000000以上图为例如果我们在栈上分配一个unsigned char buf4,那么这个数组变量在栈上是如何布局的呢注1?看下图:栈底 (高地址)-buf3 buf2buf1buf0-栈顶 (低地址)现在我们弄清了高低地址,接着我来弄清高/低字节,如果我们有一个32位无符号整型0x12345678(呵呵,恰好是把上面的那

15、4个字节buf看成一个整型),那么高位是什么,低位又是什么呢?其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。高低地址和高低字节都弄清了。我们再来回顾一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf4来表示value:Big-Endian: 低地址存放高位,如下图:栈底 (高地址)-bu

16、f3 (0x78) - 低位buf2 (0x56)buf1 (0x34)buf0 (0x12) - 高位-栈顶 (低地址)Little-Endian: 低地址存放低位,如下图:栈底 (高地址)-buf3 (0x12) - 高位buf2 (0x34)buf1 (0x56)buf0 (0x78) - 低位-栈顶 (低地址)在现有的平台上Intel的X86采用的是Little-Endian,而像Sun的SPARC采用的就是Big-Endian。三、例子测试平台: Sun SPARC Solaris 9和Intel X86 Solaris 9我们的例子是这样的:在使用不同字节序的平台上使用相同的程序读

17、取同一个二进制文件的内容。生成二进制文件的程序如下:/* gen_binary.c */int main()         FILE    *fp = NULL;        int     value = 0x12345678;        int     rv = 0;

18、        fp = fopen("temp.dat", "wb");        if (fp = NULL)                 printf("fopen error/n");    &

19、#160;           return -1;                rv = fwrite(&value, sizeof(value), 1, fp);        if (rv != 1)       

20、          printf("fwrite error/n");                return -1;                fclose(fp);  

21、      return 0;读取二进制文件的程序如下:int main()         int             value   = 0;        FILE        

22、 *fp     = NULL;        int             rv      = 0;        unsigned        char buf4

23、;        fp = fopen("temp.dat", "rb");        if (fp = NULL)                 printf("fopen error/n");    

24、            return -1;                rv = fread(buf, sizeof(unsigned char), 4, fp);        if (rv != 4)       

25、;          printf("fread error/n");                return -1;                memcpy(&value, buf, 4); / or value = *(int*)buf);        printf("the value is

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论