java socket通信中,将数据转为字节或者字节数组的形式,装入输出流或者DatagramPacket进行通信
需要了解的是java对这些数据的处理机制
1.基本类型的数据
byte类型数据:1个字节 short类型数据:2个字节 int类型的数据:4个字节长度 long类型数据:8个字节长度
1.1 注意发送顺序
java中数据是一个字节一个字节存储的,对于超过一个字节长度的数据类型,我们必须知道这些数据的发送顺序
Big-Endian:将高位字节放在内存的低地址中,将低位字节放在内存的高地址中,JAVA和所有的网络通信协议
都是使用大端编码,在跨语言通信,可能需要考虑发送顺序的不同
Little-Endian:将高位字节放在内存的高地址中,将低位字节放在内存的低地址中
下面使用16进制表示字节,毕竟二进制表示一个字节需要8位二进制数太长了,这样需要了解二进制数和16进制数的转换
二进制数>>>>>16进制数(0-9,A-F)
1111 0000 0001 0002 >>>表示为16进制数为0xF012(0x16进制数的前缀)
1111>>>表示为十进制是15,也就是16进制的F
同理:
0000>>>0
0001>>>1
0002>>>2
结论:一个16进制数表示4位的二进制数,那么8位的二进制数表示为16进制就需要两位
这样的话:一个字节表示为16进制是需要两位
例如:0x 12345678(16进制数,表示4个字节) 在内存中的表示形式,一个字节,一个字节的存储
内存地址低位--->>>>>>>>>>>>内存地址高位
big-endian顺序表示为:0x12 0x34 0x56 0x78
Litttle-Endian顺序表示为:0x78 0x56 0x34 0x12
因而信息的接受者和发送者,需要明确order of transmission 传输顺序,不能是发送者使用
Big_Endian顺序,而接受者使用Little_Endian接受,这样将获取到错误的信息
1.2注意有符号数
java中的四种基本整型都是有符号的,有正负之分,在存储的时候,需要以补码的形式存储。
需要转为二进制表示,最高位是符号位,0表示正数,1表示负数
正数的补码是其本身
例如: 0111111 >>>补码是 01111111
负数的补码
取得原码,原码符号位不变,数值位取反,获得反码,反码加1获得补码
-127 表示为二进制 11111111
取得原码:11111111
反码为:10000000
补码为:10000001
(-128的补码表示为1000000,负数的补码等于 模-绝对值,模可以理解为,有多少位数参与运算,就在1后面加
多少个0,8位的模就是256,这样-128的补码为(256-128)100000000- 10000000=10000000)
总的来说,对于基本类型的数据,java按照补码的方式进行存储,对于超过一个字节长度的数据,都是采用
Big-Endian存储的,不要我们手动编码,java socket提供了现有的api,dataoutputstream 的writeByte(),
writeShort(),writeInt(),将基本类型的数据会使用big-Endian方式按照补码的形式写入到流中
2. 字符串和文本
按照字符集编码(将在一组符号和数字之间映射),转为字节,String.getByte(),可以指定编码,将
字符串和文本转为字节
参照文章:blog.csdn.net/ce123_zhouwei/article/details/6971544