最近工作中碰到的一个问题,记录下。
问题如下:有时候我们需要从网络中读取字节流,需要把字节流中的数据进行解析转换,或者是向网络中发送字节流,我们如何把字节流转换整数类型?
1、我们需要把一个int类型的数据转换成一个四字节的整数数组,可以通过右位移的方位来实现,一个int类型的数据占4个字节,一共32位,我们只需要依次把这四个字节中的每一个字节取出来即可
例如 :int a = 1234567897, a 在内存里制数据为:01001001 10010110 00000010 11011001,我们只需要把各个字节上的数据移到最低位,然后在通过 & 运算符把数据中最低位的八位数据取出来即可。下面是伪代码,试着理解一下。
01001001 10010110 00000010 11011001 >>> 24
00000000 00000000 00000000 01001001 & 0xff
01001001
01001001 10010110 00000010 11011001 >>> 16
00000000 00000000 01001001 10010110 & 0xff
10010110
01001001 10010110 00000010 11011001 >>> 8
00000000 01001001 10010110 00000010 & 0xff
00000010
01001001 10010110 00000010 11011001 >>> 0
01001001 10010110 00000010 11011001 & 0xff
11011001
2、如果我们拿到一个字节数组,如何把字节数组转换成整数类型呢?例如下面这个字节数组,存储的是一个四字节的整数型数据,数据存储的顺序为从高位到低位存储的。我们可以通过左位移的方式,把各个字节的数据取出来,然后把各字节的数据加起来即可。(伪代码)
[00100, 10010110,00000010,11011001]
0100100 << 24
0100100 00000000 00000000 00000000
10010110 << 16
10010110 00000000 00000000
00000010 << 8
00000010 00000000
11011001 << 0
11011001
最后把各个各个字节的数据加起来,最后得到完整的数据。
0100100 00000000 00000000 00000000 |
10010110 00000000 00000000 |
00000010 00000000 |
11011001
01001001 10010110 00000010 11011001
下面是JAVA代码
//int 转字节数组,字节数组转int
public static void intToByteArray(){
int a = 1234567897;
System.out.println(Integer.toBinaryString(a));
//两种转换方法,先取最高字节,在位移
System.out.println("[0] "+Integer.toBinaryString((a & 0xff000000) >> 24));
System.out.println("[1] "+Integer.toBinaryString((a & 0xff0000) >> 16));
System.out.println("[2] "+Integer.toBinaryString((a & 0xff00) >> 8));
System.out.println("[3] "+Integer.toBinaryString((a & 0xff)));
byte[] data = new byte[4];
data[3] =(byte) ((a & 0xff000000) >> 24);
data[2] =(byte) ((a & 0xff0000) >> 16);
data[1] =(byte) ((a & 0xff00) >> 8);
data[0] =(byte) ((a & 0xff));
System.out.println(Arrays.toString(data));
int c = (0xff & data[0])
| (0xff00 & (data[1] << 8))
| (0xff0000 & (data[2] << 16))
| (0xff000000 & (data[3] << 24));
System.out.println(c);
//直接位移,从高到低位
System.out.println("[0] "+Integer.toBinaryString((a >>> 24) & 0xFF));
System.out.println("[1] "+Integer.toBinaryString((a >>> 16) & 0xFF));
System.out.println("[2] "+Integer.toBinaryString((a >>> 8) & 0xFF));
System.out.println("[3] "+Integer.toBinaryString((a >>> 0) & 0xFF));
byte[] data1 = new byte[4];
data1[0] =(byte) ((a >>> 24) & 0xFF);
data1[1] =(byte) ((a >>> 16) & 0xFF);
data1[2] =(byte) ((a >>> 8) & 0xFF);
data1[3] =(byte) ((a & 0xff));
System.out.println(Arrays.toString(data1));
int b = (0xff000000 & (data1[0] << 24))
| (0xff0000 & (data1[1] << 16))
| (0xff00 & (data1[2] << 8))
| (0xff & data1[3]);
System.out.println(b);
}