`
tang9140
  • 浏览: 35104 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java中int与byte数组互转代码详细分析

 
阅读更多

转载请注明出处:http://blog.csdn.net/tang9140/article/details/43404385

在java中,可能会遇到将int转成byte[]数组,或者将byte[]数组转成int的情况。下面我们来思考下怎么实现?

首先,分析int在java内存中的存储格式。

众所周知,int类型在内存中占4个字节,采用补码方式存储(假如对原码、反码、补码不熟悉,请查阅相关资料)。举例:

整型-128对应内存中的二进制值为


整型128对应内存中的二进制值为


然后,考虑如何把int类型4个字节放入byte数组中。

有两种可选方式:一是int低字节数据放置在byte数组低位置(little-endian),二是int低字节数据放置在byte数组高位置(big-endian)。两种方式都行,实际使用时,以既有约定为准。这里采用big-endian。以整型-128为例,转化后的byte数组为


说清转化思路后,请看实现代码,如下:

    public static byte[] int2Bytes(int value, int len) {
        byte[] b = new byte[len];
        for (int i = 0; i < len; i++) {
            b[len - i - 1] = (byte)((value >> 8 * i) & 0xff);
        }
        return b;
    }

需要说明下位操作符“>>”。>>是带符号右移,使用格式为value >> n。如果n大于value类型所占二进制位数m时(上例value为int类型,则m为32位),则右移n%m位(%取模操作符)。

注意:细心的读者可能会发现,在对value进行移位操作后,还需要跟字面量0xff(二进制 00000000 00000000 00000000 11111111)相与,即将value前3个字节都置为00000000,最后一个字节保存不变,思考下这步操作是否必要呢?

其实完全没必要,在将int强制转换成byte时,会自动丢弃前3个字节,前3个字节值是否全为0,对结果完全没影响,因此与操作完全是多余的,没有任何作用且浪费了一点点程序执行效率。

修改后代码为

b[len - i - 1] = (byte)((value >> 8 * i));

下面考虑怎么将上述byte数组反转成int。

我们的想法是,依次从byte数组中取出单个byte,对每个byte通过与及左移位操作还原成对应位置的int,最后将得各个int值相加汇总,即为所要的结果。文字可能没表达清楚,直接以整型-128转成的数组byte为例,说明如何将该byte数组反转化为整型-128。


代码如下:

    public static int bytes2Int(byte[] b, int start, int len) {
        int sum = 0;
        int end = start + len;
        for (int i = start; i < end; i++) {
            int n = ((int)b[i]) & 0xff;
            n <<= (--len) * 8;
            sum += n;
        }
        return sum;
    }

请注意,上述代码中将b[i]强制转换成int,实际上属于多余操作。在进行&操作时,两个操作数会先自动转换成int类型,详细请参照我的另一篇博客《java对byte,short,char,int,long运算时自动类型转化情况说明》

因此简化版代码为

int n = b[i] & 0xff;

继续思考下上面的&操作是否必要呢,能不能直接改成

int n = b[i];

答案是不行。对于单个byte类型,在java内存中占一个字节,同样是以补码方式存储。如byte型变量-1(二进制值为1111 1111),强制转换成int类型后对应的二进制值为1111 1111 1111 1111 1111 1111 1111 1111,不是我们需要的0000 0000 0000 0000 0000 0000 1111 1111因此需要跟0xff相与,以达到将前3个字节置为0的目的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    java基本类型与byte数组互相转换.pdf

    Java 中的基本类型与 byte 数组之间的转换是非常重要的,以下是关于 Java 基本类型与 byte 数组互相转换的相关知识点: 1. short 类型转换成 byte 数组 在 Java 中,short 类型是 16 位的整数类型,而 byte 数组是...

    byte数组转换工具类 byte数组转int,byte数组转short,short转byte数组

    byte数组操作的工具类,支持byte数组转int,int转byte数组,byte数组转short,short转byte数组。。。 下载的人多了,csdn会自动涨分,现在可以手动调了,我给降到最低了

    Java数值类型与byte数组相互转换

    Java bytes数组与基本类型的相互转换 Int -&gt; Bytes int64ToByte8 int48ToByte6 int40ToByte5 int32ToByte4 int24ToByte3 int16ToByte2 int8ToByte Bytes -&gt; Int bytesToInt64 bytesToInt48 bytesToInt40 bytesTo...

    java中两个byte数组实现合并的示例

    在Java编程语言中,有时我们需要将两个或多个字节数组(`byte`数组)合并成一个新的单一数组。这种情况在处理二进制数据、文件读写或者与硬件交互时尤其常见。本文将深入探讨如何在Java中实现两个`byte`数组的合并,...

    Java byte数组与其他类型转换

    本文将深入探讨如何在Java中将byte数组与其他基本类型(如short、int、long)进行转换,这些转换在处理二进制数据、网络通信或序列化等方面至关重要。 首先,我们来看byte数组与short之间的转换。在Java中,byte...

    java基本类型与byte数组互相转换.doc

    在上面的代码中,我们可以看到将Java基本类型转换为byte数组的多个方法,每个方法都可以将对应的基本类型转换为byte数组。例如,shortToByteArr方法将short类型转换为byte数组,intToByteArr方法将int类型转换为byte...

    int类型和byte数组之间的转换

    写一个方法,将int类型转换为字节数组,输入任意int类型整型,输出字节数组;写第二个方法,输入字节数组,输出对应int类型数据。

    java byte相互转换详解左右位移

    在Java中,基本数据类型byte与int之间的相互转换涉及到计算机的二进制运算、位移操作以及补码的概念。我们首先了解Java中int和byte的数据结构,然后探讨它们之间的转换方法及其背后的原理。 **基本数据类型结构:**...

    Java将图片转换为byte数组例子总结

    ### Java将图片转换为byte数组及反向转换的知识点总结 #### 一、知识点概述 在Java编程中,经常需要处理图像数据,特别是在网络传输或存储时,将图像转换为`byte`数组是一种常见的做法。这不仅可以提高传输效率,...

    基于java中byte数组与int类型的转换(两种方法)

    在Java编程中,将`int`类型转换为`byte`数组以及从`byte`数组还原回`int`类型是常见的操作,特别是在网络编程中。这是因为网络传输的数据通常以字节流的形式存在,而`int`等基本数据类型需要进行适当的序列化才能...

    java数据类型转byte数组

    ip地址转4字节byte,char转2字节byte,byte数组转char,int整数转换为4字节的byte数组,byte数组转换为int整数,double类型转8字节数组,8位数组转double,long整数转换为8字节的byte数组,short整数转换为2字节的...

    java基本类型与byte数组互相转换

    ### Java基本类型与Byte数组互相转换 在Java编程语言中,基本类型的变量(如`short`、`int`、`long`、`char`、`double`和`float`)和`byte`数组之间的相互转换是一项非常实用的技术,尤其是在网络通信、文件读写等...

    java基本类型与byte数组互相转换文.pdf

    在 Java 中,基本类型可以使用 bitwise 运算符来实现与 byte 数组的转换。例如,将 short 类型转换成 byte 数组可以使用 bitwise right shift 运算符 (&gt;&gt;) 和 bitwise AND 运算符 (&)。将 int 类型转换成 byte 数组...

    String(含Hex)与Byte数组互相转换[代码]

    在Java或类似的编程语言中,我们经常会遇到需要将字符串(String)与字节数组(Byte[])以及十六进制表示的字符串(Hex)进行相互转换的情况。这些转换在处理网络通信、文件存储、加密解密等领域尤为关键。下面我们...

    java整数与byte数组的转换实现代码

    Java整数与byte数组的转换实现代码 Java整数与byte数组的转换是Java编程中常见的操作,以下是相关的知识点: 一、Java整数与byte数组的转换实现代码 Java中的整数可以转换为byte数组,以便于在网络上传输或存储。...

    Java中byte、byte数组与int、long的转换详解

    2. **Java中byte数组和int之间的转换** - **byte数组转int**:当需要从`byte`数组中读取`int`时,通常需要按照字节顺序(Big-Endian或Little-Endian)组合数组中的字节。例如,如果数组是Big-Endian,可以按顺序将...

    转换Image数据为byte数组

    下面,我们将深入探讨如何在Java中实现图像数据与字节数组之间的相互转换,并分析这一过程中的关键步骤和技术细节。 ### 转换Image数据为byte数组 #### 方法一:`imageToBytes`函数解析 在Java中,将`Image`对象...

    拼接byte数组

    总结起来,“拼接byte数组”是编程中处理二进制数据的基本操作,涉及到了数组复制、内存管理和性能优化等概念。在实际应用中,我们需要根据具体场景选择合适的方法,并考虑到性能和资源的有效利用。

    java实现的字节数组转换成基本类型,基本类型转换成byte[]

    char short int long float double 转换成byte数组

Global site tag (gtag.js) - Google Analytics