Java 字节数组(byte[])和整型(int)的相互转换

这篇具有很好参考价值的文章主要介绍了Java 字节数组(byte[])和整型(int)的相互转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

      恰巧碰到了字节数组和整型的转换问题,特在此总结一下。将 int 按照小端法映射到 byte[] 中。即最低 8 位放在 byte[0] 中,依次类推。


一、int 转换为 byte[]

      这个实现起来比较简单,先保存最低的 8 位到 byte 数组中,然后不断的右移 8 位,每次保存低 8 位数据即可,参考代码:(这里包含一个 int 到 byte 的转换,转换规则是截取 int 的最低 8 位作为 byte 值)

    public static byte[] intToBytes(int a){
        byte[] ans=new byte[4];
        for(int i=0;i<4;i++)
            ans[i]=(byte)(a>>(i*8));//截断 int 的低 8 位为一个字节 byte,并存储起来
        return ans;
    }

二、测试代码

      为了验证转换结果,简单写了两个方法用来按位打印 int 和 byte,可参考如下:

    public static void intPrint(int a){//将 int 按位从左到右打印
        int count=0;
        for(int i=31;i>=0;i--){
            System.out.print((a>>i)&1);
            count++;
            if(count==4){//每四位为一组,用空格分开
                System.out.print(" ");
                count=0;
            }
        }
        System.out.println();
    }
    public static void bytePrint(byte a){//将 byte 按位从左到右打印
        int count=0;
        for(int i=7;i>=0;i--){
            System.out.print((a>>i)&1);
            count++;
            if(count==4){//每四位为一组,用空格分开
                System.out.print(" ");
                count=0;
            }
        }
        System.out.println();
    }

三、测试

      测试一下 int 到 byte[] 的正确性:用一个整数来测试一下,如下:

    public static void main(String[] args) {
        int c=968523,d=-65423;
        byte[] ans=intToBytes(d);
        intPrint(d);
        for(int i=0;i<4;i++)
            bytePrint(ans[i]);
            
    }

      输出结果为:
      1111 1111 1111 1111 0000 0000 0111 0001
      0111 0001
      0000 0000
      1111 1111
      1111 1111

      算法执行无误。

四、byte[] 转换为 int

      这个实现起来也比较简单, 每次将 byte 值保存到 int 的最低 8 位,然后 int 左移 8 位,继续保存新的 byte 值即可,参考代码:

    public static int bytesToInt(byte[] a){
        int ans=0;
        for(int i=0;i<4;i++){
            ans<<=8;//左移 8 位
            ans|=a[3-i];//保存 byte 值到 ans 的最低 8 位上
            intPrint(ans);
        }
        return ans;
    }

      验证一下(这一次采用整数 c 来说明问题,整数 d 恰好可以得到正确结果…):

    public static void main(String[] args) {
        int c=968523,d=-65423;
        byte[] ans=intToBytes(c);
        intPrint(c);
        for(int i=0;i<4;i++)
            bytePrint(ans[i]);

        int e=bytesToInt(ans);
    }

      输出结果:
      0000 0000 0000 1110 1100 0111 0100 1011
      0100 1011
      1100 0111
      0000 1110
      0000 0000
      0000 0000 0000 0000 0000 0000 0000 0000
      0000 0000 0000 0000 0000 0000 0000 1110
      1111 1111 1111 1111 1111 1111 1100 0111
      1111 1111 1111 1111 1100 0111 0100 1011

      Error:粗体显示和我们预料中的不太一样,其原因在于:语句 ans|=a[3-i];中,执行流程为:先将 byte a[3-i] 提升到 int ,然后再和 ans 取或操作,最后将结果赋给 ans。
      在提升的过程中包含一个 byte 到 int 的转换,转换规则:如果 byte 值为负,即最高位为 1,那么在前面补上 24 个 1 凑够 32 位作为 int 的值,如果 byte 值为正,即最高位为 0,那么在前面补上 24个 0 得到新的 int 值。

      为了每次在将 byte 转换为 int 时,前面都补上 0 ,这里可以将它先和 0xff 取 &。这里的 0xff 如果转换为 int 四字节的话为:0000 0000 0000 0000 0000 0000 1111 1111 。当然了,更加清晰的写法见下面代码。

      修改之后的代码如下:

    public static int bytesToInt(byte[] a){
        int ans=0;
        for(int i=0;i<4;i++){
            ans<<=8;
            ans|=(a[3-i]&0xff);
            /* 这种写法会看起来更加清楚一些:
            int tmp=a[3-i];
            tmp=tmp&0x000000ff;
            ans|=tmp;*/
            intPrint(ans);
        }
        return ans;
    }
    
    public static void main(String[] args) {
        int c=968523,d=-65423;
        byte[] ans=intToBytes(c);
        intPrint(c);
        for(int i=0;i<4;i++)
            bytePrint(ans[i]);

        int e=bytesToInt(ans);
        return;
    }

      输出结果:
      0000 0000 0000 1110 1100 0111 0100 1011
      0100 1011
      1100 0111
      0000 1110
      0000 0000
      0000 0000 0000 0000 0000 0000 0000 0000
      0000 0000 0000 0000 0000 0000 0000 1110
      0000 0000 0000 0000 0000 1110 1100 0111
      0000 0000 0000 1110 1100 0111 0100 1011

      能够看到可以得到正确结果。


总结

      需要注意的是:在 8 位 byte 提升到 32 位 int 时,由于数组在计算机中以补码形式存在,所以要区分正负的。正数前面补 0 ,负数前面补 1。而为了消除其差异性,仅保留我们所感兴趣的低 8 位,需要先将可能存在的 1 均变为 0,所以要先和 0xff 做 & 操作; 或者先提升到 int ,然后和0x000000ff 取 & 。文章来源地址https://www.toymoban.com/news/detail-411254.html

到了这里,关于Java 字节数组(byte[])和整型(int)的相互转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java:List相互转换数组

    经常我们会遇到前端传服务端值为数组的时候我们需要对其转换成集合便于一些其它操作,删除,匹配等操作,今天我们就总结下数组集合相互转换的方法 1、Object[] objArray = arrayList.toArray(); 2、String[] strArray = new String[list.size()]; 3、String[] strArray = list.toArray(new String[list.size()])

    2024年01月18日
    浏览(47)
  • Java中List与数组之间的相互转换

    List列表中存储对象,如 ListInteger 、 ListString 、 ListPerson ,对象数组中同样存储相应的对象,如Integer[]、String[]、Person[],对象数组与对象List的转换可通过如下方式实现: (一)对象List转对象数组 1、toArray()方法 直接调用对象List的toArray()方法转换为对象数组,该方法的参数是

    2024年02月16日
    浏览(48)
  • 字符串string转换长整型int(八进制、十进制、十六进制)

    strtoul() 是C语言标准库中用于将字符串转换成无符号长整数的函数。它的完整原型如下: 其中, nptr 代表要被转换成无符号长整数的字符串; endptr 是一个指向字符指针的指针,该指针指向已经转换了的最后一个字符的下一个位置; base 指定要采用的进制,范围是2 ~ 36。 该函

    2024年02月07日
    浏览(54)
  • #java 逗号分隔String字符串 - 数组 - 集合,相互转换

    1. 准备一个逗号分割字符串 2. 逗号分割字符串转换为集合(转换为集合之前会先转换为数组) 3. 集合转换为逗号分隔的字符串 4. 数组转逗号分隔字符串

    2024年02月04日
    浏览(54)
  • 实现对象转成字节数组(整型支持按位写入,字符串则按字节写入)

    闲着无聊,写了一个对象转换成byte[]的工具类,支持整型按位写入(大大节省空间),具体步骤如下: 1. 定义实体类和注解 2. 工具类     3. 测试结果     参考文章: https://www.cnblogs.com/Dotnet9-com/p/17981055

    2024年01月23日
    浏览(47)
  • python中str、bytes、十六进制字符串的相互转换

    python中str、bytes、十六进制字符串的介绍 str是python的内置函数,str字符串在python中使用 \\\'\\\' 或者 \\\"\\\" 括起来的字符串,比如: bytes也是python的内置函数,bytes字符串通常以b开头,比如: 十六进制字符串是指字符串中每个字符表示一个十六进制数,两个字符组成一个字节,比如

    2024年02月21日
    浏览(54)
  • python中str与int类型的相互转换

    1. str转换成int 方法:使用int()函数 3. int转换成str 方法:使用str()函数

    2024年02月13日
    浏览(49)
  • C语言中的char类型和int类型的相互转换

    C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植等特点。C语言中有多种数据类型,用来表示不同的数据和信息。本文将介绍C语言中的两种基本数据类型:char类型和int类型,以及它们之间的相互转换的方法和原理。 char类型是一种字符类型,用来表示单个字符,

    2024年02月03日
    浏览(54)
  • C++中string类型和int类型之间的相互转换【全网最全】

    字符串操作是各种算法题中的常客,很多数据常常以字符串形式给出,其中有的需要自己转化成整数,而一些整型数据有时转换成字符串处理起来更加方便,比如判断一个整数是否是回文数,所以字符串和整数的转换是一些问题处理的基础步骤, C++  在处理这类问题时并不像

    2024年02月04日
    浏览(64)
  • java将list转为逗号隔开字符串,将逗号连接的字符串转成字符数组,​将逗号分隔的字符串转换为List​(Java逗号分隔-字符串与数组相互转换)

       参考:java将list转为逗号隔开字符串_51CTO博客_list转字符串逗号隔开 Java将字符串转化为数组_java 字符串转数组-CSDN博客  Java逗号分隔-字符串与数组相互转换-CSDN博客  

    2024年02月08日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包