您的位置:首页 > 编程语言 > Java开发

关于JAVA中:int和byte的互相转换

2018-01-02 10:42 387 查看


一、基础概念:

1.原码:

一个byte是一个字节,一个字节是由8个位组成。其中最高位是符号位,范围就是127 ~ -128。

即:0111 1111~1111 1111

也就是说:0000 0001 代表的是1,

   1000 0000 代表的是-1。
2.反码:

正数的反码是其本身(正数的符号位是0);

负数的反码是:在原码的基础上,符号位不变,其他位取反。(负数的符号位是1)

即:-1的原码是: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之间的互相转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息