java socket 通信中对数据的处理(Big-Endian和Little-Endian)

来源:互联网 发布:迷宫生成算法 opengl 编辑:程序博客网 时间:2024/05/16 00:25

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

阅读全文
0 0
原创粉丝点击