Java: int 与 byte数组互转

1,212 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前置知识: 传送

如果还不了解请看往期博客:  传送

int 转 byte数组


    /**
     * 一个int是4个byte 1个byte是8个bit 所以要右移位三次 每次8位
     * 如 1111 1111 1010 1010 0101 0101 0000 0000
     * [1111 1111, 10101 010, 0101 0101, 0000 0000]
     */
    private static byte[] toByteArr(int i) {
        // 因为一个 int 类型是 4个 byte 所以这里要开辟 4位 空间
        byte[] b = new byte[4];
        // 16 进制的 0xFF 也就是 2进制中的 1111 1111 这一步是获得前8位的二进制数据
        b[0] = (byte) ((i >>> 24) & 0xFF);
        // 同理 这一步是获取 第9位到第16位的二进制数据
        b[1] = (byte) ((i >>> 16) & 0xFF);
        // ...
        b[2] = (byte) ((i >>> 8) & 0xFF);
        b[3] = (byte) (i & 0xFF);
        // 因为 int 是 32 个 bit 所以到这里就获取到 字节数组了
        return b;
    }

 

byte数组 转 int


    /**
     * 一个int 4个字节 每个字节8位 所以要左移位三次 每次8位
     */
    private static int toInt(byte[] b) {
        // 合并规则主要看 如何转的 byte数组
        // 如果转 byte[] 是从前8位右移 那么转 int 需要从 (32-8) 位开始左移
        return (b[0] & 0xFF) << 24 | (b[1] & 0xFF) << 16 | (b[2] & 0xFF) << 8 | (b[3] & 0xFF);
    }

int 转 byte数组原理

   
    比如要转的数为 9 那么需要先转为2进制
    0000 0000 0000 0000 0000 0000 0000 1001

    第一次右移24位 获得到 0000 0000 & 1111 1111 = 0
    第二次右移16位 获得到 0000 0000 & 1111 1111 = 0
    第三次右移8位  获得到 0000 0000 & 1111 1111 = 0
    第四次无需移位 获得到 0000 1001 & 1111 1111 = 0b1001 = 9

    最终结果为: [0, 0, 0, 9]

 byte数组 转 int 原理

    
    反推 [0, 0, 0, 9]

    获得到第一个字节的二进制值 0 = 0000 0000 0000 0000 0000 0000 0000 0000
    获得到第二个字节的二进制值 0 = 0000 0000 0000 0000 0000 0000 0000 0000
    获得到第三个字节的二进制值 0 = 0000 0000 0000 0000 0000 0000 0000 0000
    获得到第四个字节的二进制值 0 = 0000 0000 0000 0000 0000 0000 0000 1001
 
    第一个字节左24移位 并且 & 0xFF 获得到 0000 0000                                   |
    第二个字节左16移位 并且 & 0xFF 获得到           0000 0000                         |
    第三个字节左8移位  并且 & 0xFF 获得到                     0000 0000               |
    第四个字节无需移位 并且 & 0xFF 获得到                               0000 1001
    合并结果                            0000 0000 0000 0000 0000 0000 0000 1001  =  9

测试 

   
   public static void main(String[] args) {
        byte[] bytes = toByteArr(9);
        System.out.println(Arrays.toString(bytes));
        System.out.println(toInt(bytes));
        System.out.println();

        byte[] bytes1 = toByteArr(-65555);
        System.out.println(Arrays.toString(bytes1));
        System.out.println(toInt(bytes1));
        System.out.println();

        byte[] bytes2 = toByteArr(Integer.MAX_VALUE);
        System.out.println(Arrays.toString(bytes2));
        System.out.println(toInt(bytes2));
        System.out.println(Integer.MAX_VALUE);
    }

结果

A:\Work\jdk1.8\bin\java.exe ...

[0, 0, 0, 9]
9

[-1, -2, -1, -19]
-65555

[127, -1, -1, -1]
2147483647
2147483647

Process finished with exit code 0

结束

  这就是本期的运算符讲解  感觉有用就点个赞吧 如果有错误或更好的方法评论区请多多指出  相互学习共同进步