java int与byte相互转换

说明

java中int是4个字节,转成byte时,是长度为4的byte数组

int转byte

转换思路

将十进制的 16909320,转成二进制,是:00000001 00000010 00000100 00001000
每8个数是1组(表示1个字节),共4组,即4个字节

第一个字节的计算过程:

取出前8个数:
00000001 00000010 00000100 00001000 >> 24 (右移24位)
= 00000001
= 1(十进制)

第二个字节的计算过程:

第一步,取出前16个数:
00000001 00000010 00000100 00001000 >> 16(右移16位)
= 00000001 00000010

第二步,从第一步的结果中取出后8个数:
00000001 00000010 & 0xff
= 00000001 00000010 & 00000000 11111111
= 00000000 00000010
= 2(十进制)

第三个字节的计算过程:

第一步,取出前24个数字:
00000001 00000010 00000100 00001000 >> 8
= 00000001 00000010 00000100

第二步,从第一步的结果中取出后8个数:
00000001 00000010 00000100 & 0xff
= 00000001 00000010 00000100 & 00000000 00000000 11111111
= 00000000 00000000 00000100
= 4(十进制)

第四个字节的计算过程:

算最后8个数:
00000001 00000010 00000100 00001000  & 0xFF
= 00000001 00000010 00000100 00001000  & 00000000 00000000 00000000 11111111
= 00000000 00000000 00000000 00001000
= 8(十进制)

结果是:[1,2,4,8]

代码

/**
 * int到byte[] 由高位到低位
 * @param i 需要转换为byte数组的整行值。
 * @return byte数组
 */
public static byte[] intToByteArray(int i) {
    byte[] result = new byte[4];
    result[0] = (byte)((i >> 24) & 0xFF);
    result[1] = (byte)((i >> 16) & 0xFF);
    result[2] = (byte)((i >> 8) & 0xFF);
    result[3] = (byte)(i & 0xFF);
    return result;
}

byte数组转int

转换思路

取出第一个字节进行转换:

第一步:
1(十进制)
= 00000001(转二进制)

第二步:
00000001 << 24
= 00000001 00000000 00000000 00000000
= 16777216

取出第二个字节进行转换:

第一步:
2(十进制)
= 00000010(转二进制)

第二步:
00000010 << 16
= 00000010 00000000 00000000
= 131072

取出第三个字节进行转换:

第一步:
4(十进制)
= 00000100(转二进制)

第二步:
00000100 << 8
= 00000100 00000000
= 1024

第四个字节不需要位移运算

将上面的4个数字累加求和

16777216 + 131072 + 1024 + 8 = 16909320

代码

/**
 * byte[]转int
 * @param bytes 需要转换成int的数组
 * @return int值
 */
public static int byteArrayToInt(byte[] bytes) {
    int value=0;
    for(int i = 0; i < 4; i++) {
        int shift= (3-i) * 8;
        value +=(bytes[i] & 0xFF) << shift;
    }
    return value;
}

通用转换

/**
 * 将数字 i 转换为 长度是 x 的byte数组
 * @param i
 * @param x
 * @return
 */
public static byte[] intToByteArray(int i,int x) {
    byte[] result = new byte[x];
    for(int start = x ; start>0 ;start--){
        result[x-start] = (byte) ((i >> 8*(start-1)) & 0xFF);
    }
    return result;
}
/**
 * 将 长度是x的byte数组 转换成 int 型
 * @param bytes
 * @param x
 * @return
 */
public static int byteArrayToInt(byte[] bytes,int x) {
    int value=0;
    for(int i = 0; i < x; i++) {
        int shift= (x-1-i) * 8;
        value +=(bytes[i] & 0xFF) << shift;
    }
    return value;
}

参考:
https://blog.csdn.net/alvinhuai/article/details/82790888