数据通信过程中,若客户端和服务器端都采用java语言,则客户端进行通信时给服务器端发送系列化的对象。将服务器端的语言改为C语言则会提高速度,C语言作为底层语言,比java语言快。改为C语言后,若客户端发送的仍然是系列化的对象,则服务器端无法解析。解决方法:将数据用二进制来表示,达到跨平台的兼容
java中的数据类型:
1、int型的数据类型:byte 8位;short 16位;int 32位;long 64位;
2、float型数据类型:单精度(32位);双精度(64位);
3、boolean型:1位;
4、char型数据类型:unicode字符,16位;
对应的类的类型为:Integer Float Boolean Character Double Short Byte Long
一、将十进制转化为其他进制:如将十进制112分别转化为二进制、八进制、十六进制
System.out.println(Integer.toBinaryString(112));//二进制
System.out.println(Integer.toHexString(112));//十六进制
System.out.println(Integer.toOctalString(112));//八进制
输出结果为:
1110000
70
160
二、将其他进制转化为十进制:
System.out.println(Integer.parseInt("111001",2));//二进制
System.out.println(Integer.parseInt("27",8));//八进制
System.out.println(Integer.parseInt("A8",16));//十六进制
输出结果为:
57
23
168
三、将各种数据类型转化为字节数组:
public byte[] intTobytes(int id) {
byte[] arr=new byte[8];
for(int i=0;i<arr.length;i++) {
arr[i]=(byte)((int)(id>>i*8)&(0xff));
}
return arr;
}
如将整数8413作为参数传入该函数,则先将8143转换为二进制进行右移运算,即对00000000 00000000 00011111 11001111进行右移运算并和16进制0xff进行与运算
arr[0],右移0位,和11111111相与,得11001111,负数以其正值的补码形式表示,因此首先对该补码减一得到反码:
11001110。取反得到原码:00110001,该原码对应的真值为49,则表示的负数为-49;
arr[1],右移8位,得到00000000 00000000 00000000 00011111,与0xff进行与运算,得到00011111,表示的正值为31;
arr[2],右移16位,得到00000000 00000000 00000000 00000000,与运算之后得到正值为0,同理arr[3]也为0;
四、将字节码转换成相应的数据类型:
public int byteToInt(byte[] arr) {
int[] newint=new int[4];
int result=0;
for(int i=0;i<4;i++) {
newint[i]=(int)((arr[i]&(0xff))<<i*8);
result+=newint[i];
}
return result;
}
仍然对于8143,求得字节码[-49,31,0,0]之后,转换成相应的数据类型:
-49:进行与运算左移0位之后得207;
31:进行与运算之后左移8位之后得到00011111 00000000,转换为int为7936;
0:进行与运算之后左移16位得到00000000 00000000 00000000,转换为int为0;
0:进行与运算之后左移24位得到00000000 00000000 00000000 00000000,转换为int为0;
则最终得到的int值为207,7936,0,0之和,为8143;