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的目的。

时间: 2024-11-08 13:07:15

java中int与byte数组互转代码详细分析的相关文章

【转】java中float与byte[]的互转 -- 不错

原文网址:http://tjmljw.iteye.com/blog/1767716 起因:想把一个float[]转换成内存数据,查了一下,下面两个方法可以将float转成byte[]. 方法一 Java代码   import java.nio.ByteBuffer; import java.util.ArrayList; float buffer = 0f; ByteBuffer bbuf = ByteBuffer.allocate(4); bbuf.putFloat(buffer); byte

java中int与byte相互转换

1:int和byte的关系 在java中,int整形变量是32位的,而byte是8位的,他们之间的转换有一定的策略和讲究. 1.1:int 到byte 首先我们实现int和byte之间的转换,思路如下: 创建一个byte数组,长度为4.byte[0]是最高位,byte[1]是次高位,byte[2]是次次高位,byte[3]是最低位, 在将int数据右移24位,然后与0xFF相与即可得到byte[0]. 在将int数据右移16位,然后与0xFF相与即可得到byte[1]. 在将int数据右移8位,

Java中Int转byte分析

针对声明变量 int i = 3,j = 8; int占4个字节,i = 3 在Java二进制表示: 00000000 00000000 00000000 00000011 j = 8 在Java二进制表示: 00000000 00000000 00000000 00001000 下面进行运算: 1.按位与:每一位进行按位与运算,规则是 1&1 = 1:1&0 = 0:0&1 = 0:0&0 = 0: 所以i & j = 0 2.右位移或者左位移 i>>

013、Java中int类型转换byte

01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public static void main(String[] args) { int num = 130; // 此范围超过了byte定义 byte x = (byte) num; // 由int变为byte System.out.println(x); } } 02.效果如下: 知识有价,如果您认为这篇文

转:Java中String与byte[]的转换

fuzhaoyang 转:Java中String与byte[]的转换 原文地址:http://blog.csdn.net/llwan/article/details/7567906 String s = "fs123fdsa";//String变量 byte b[] = s.getBytes();//String转换为byte[] String t = new String(b);//bytep[]转换为String 做JAVA经常会碰到中文乱码问题,还有各种编码的问题,特别是Stri

java 中 image 和 byte[] 相互转换

java 中 image 和 byte[] 相互转换可恶的…………其实也挺好的 只是把好不容易写出来的东西记下来,怕忘了…… 下面,我来介绍一个简单的 byte[] to image, 我们只需要一个存储了图片信息的二进制串(byte[]) 然后,这样: InputStream buffin = new ByteArrayInputStream(/*二进制串*/,                                               /*起始位置*/,           

java中的二维数组

简单讲:java中的二维数组就是"特殊的一维数组",称为一维数组中的一维数组. 只不过元素是一维数组而已. 也是有两种初始化方式:静态初始化和动态初始化. 访问最后一个元素: int[] []a=? a[a.length-1][a[a.length-1].length-1]这个表示是最后一个元素 遍历二维数组: for(int i=0;i<a.length;i++){     for(int j=0;j<a[i].length;j++){         System.ou

java中如何将char数组转化为String

1.直接在构造String时建立. char data[] = {'s', 'g', 'k'}; String str = new String(data); 2.String有方法可以直接转换. String.valueOf(char[] chr)就可以. 如: char[] cha = {'s','g','h'}; String n = String.valueOf(char[]); String.valueOf()函数支持将boolean ,char,char[],double,float

JAVA中int、String的类型转换

int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i);这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢? String -> int s="12345";int i;第一种方法:i=Integer.parseInt(s);第二种方法:i=Integer.valueOf(s).intValue();这两种方法有什么区别