JAVA中字节数组如何转换成整数类型?

最近工作中碰到的一个问题,记录下。

问题如下:有时候我们需要从网络中读取字节流,需要把字节流中的数据进行解析转换,或者是向网络中发送字节流,我们如何把字节流转换整数类型?

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);
    }

其实在JDK中已经有现成的转换方法只是在java应用中无法直接调用,java.io.Bits 以及 java.nio.Bits里面已经有各种转换方法,字节转int,字节转float,只是无法直接在java应用程序中直接调用。可以参考Bits中的转换方法。
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值