最近在写C++ socket和java socket之间的通信程序,涉及到整数浮点数的传输,需要从字节数组还原数据,查了一些资料,总结如下
1. 整数和浮点数的机器表示
在机器内部,不论是一个整数还是浮点数,都是以一个二进制串的形式存储。
整数可能是原码,补码表示,浮点数有阶码尾数两部分构成,无论怎样都是一个二进制串,但是这个二进制串如何表示不同的机器可能采取不同的方案。
关于浮点数:
一个机器上的32位浮点数的二进制串在另一个机器把它作为32位浮点数解释时可能得到不同的值,这样不同机器上进行网络传输的时候,大概就只能用传字符串的方式了,不过幸好,IEEE 754规范标准化了浮点数的表示形式,遵从这个标准的不同编程语言里只要遵从这个标准,那么某个浮点数的32位二进制串都是一样的,,,和CPU无关,和语言无关
关于整数 :
单个字节的整型值就是一个字节;占用多个字节的整数,其表示有所区别,有所谓的小端法,大端法,具体表示可以看下面的图。
2. 小端法、大端法和主机字节顺序、网络字节顺序
小端法和大端法如图所示
网络字节序就是大端顺序,因为TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。
主机字节顺序就是指相对于网络传输是的字节顺序的主机上的字节顺序,有大端表示法,小端表示法。
3. 下面给出java中的基本数据类型和字节数组byte[]之间的转换代码
本文中byte[]的顺序按照“大端顺序”,这句话的意思是说对于整数0x11223344
byte[0]保存0x11,byte[1]保存0x22,byte[2]保存0x33,byte[