一、基础概念:
1.原码:
一个byte是一个字节,一个字节是由8个位组成。其中最高位是符号位,范围就是127 ~ -128。
即:0111 1111~1111 1111
也就是说:0000 0001 代表的是1,
1000 0000 代表的是-128。
2.反码:
正数的反码是其本身(正数的符号位是0);
负数的反码是:在原码的基础上,符号位不变,其他位取反。(负数的符号位是1)
即:-128的原码是:1000 0000
反码是:1111 1111
3.补码:
补码是在原码的基础上,符号位不变,其他位取反+1。
例如: 1的原码是:0000 0001
反码是:0000 0001
符号位不变,取反: 0111 1111
+1(逢二进一)
补码是:1111 1111
二、将byte转换为int:
首先:一个int有4个八位,也就是4个字节。
1.如果我们要讲一个byte[]数组转换为int类型:
首先看如下代码:
/**
* byte数组转int类型的对象
* @param bytes
* @return
*/
public int Byte2Int(Byte[]bytes) {
return (bytes[0]&0xff)<<24
| (bytes[1]&0xff)<<16
| (bytes[2]&0xff)<<8
| (bytes[3]&0xff);
}
因为一个byte是八位,int有四个八位,所以将这个byte[0]左移24位,就将这个byte[0]放在了int的最高一个八位上。
同理,byte[1]放置在第二个八位上,byte[2]放置在第三个八位上,byte[3]放置在第四个八位上。
2.问题:为什么要&0xff?
首先0xff是十六进制的255,也就是二进制的1111 1111,对0xff取与,实际上就是要取这个数最低八位的值,截一个字节的长度。
如果不用&0xff:
①计算机中是用补码的方式进行存储数据。
②如果不用&0xff,那么在进行负数的运算时就会出现问题,如:使用-1进行运算,-1的byte补码是:1111 1111,对应的十六进制数字是0xff;
-1的int补码(32位)是1111 1111 1111 1111 1111 1111,如果将byte转换为int,那么对应的十六进制数是0xffff。
结果不正确(对于负数而言)。
所以为了计算结果的正确性,我们就要对字节进行&0xff操作。
三、将int转换为byte[ ]:
只需要进行相反的方向操作就好:
/**
* int转byte数组
* @param bytes
* @return
*/
public byte[]IntToByte(int num){
byte[]bytes=new byte[4];
bytes[0]=(byte) ((num>>24)&0xff);
bytes[1]=(byte) ((num>>16)&0xff);
bytes[2]=(byte) ((num>>8)&0xff);
bytes[3]=(byte) (num&0xff);
return bytes;
}
这样就完成了int和byte之间的互相转换。