javabyte数组转换int数组

求教如何将一个java的byte数组快速转换为int数组

public class ByteUtil {

/**

* 将 Little-Endian 的字节数组转为 int 类型的数据br /

* Little-Endian 表示高位字节在高位索引中

* @param bys 字节数组

* @param start 需要转换的开始索引位数

* @param len 需要转换的字节数量

* @return 指定开始位置和长度以 LE 方式表示的 int 数值

*/

public static int bytes2IntLE(byte[] bys, int start, int len) {

return bytes2Int(bys, start, len, false);

}

public static int bytes2IntLE(byte[] bys) {

return bytes2Int(bys, 0, bys.length, false);

}

/**

* 将 Big-Endian 的字节数组转为 int 类型的数据br /

* Big-Endian 表示高位字节在低位索引中

* @param bys 字节数组

* @param start 需要转换的开始索引位数

* @param len 需要转换的字节数量

* @return 指定开始位置和长度以 BE 方式表示的 int 数值

*/

public static int bytes2IntBE(byte[] bys, int start, int len) {

return bytes2Int(bys, start, len, true);

}

public static int bytes2IntBE(byte[] bys) {

return bytes2Int(bys, 0, bys.length, true);

}

/**

* 将字节数组转为 Java 中的 int 数值

* @param bys 字节数组

* @param start 需要转换的起始索引点

* @param len 需要转换的字节长度

* @param isBigEndian 是否是 BE(true — BE 序,false — LE 序)

* @return

*/

private static int bytes2Int(byte[] bys, int start, int len,

boolean isBigEndian) {

int n = 0;

for(int i = start, k = start + len % (Integer.SIZE / Byte.SIZE + 1); i k; i++) {

n |= (bys[i] 0xff) ((isBigEndian ? (k – i – 1) : i) * Byte.SIZE);

}

return n;

}

}

java 如何将byte[4]数组转换成一个int型数据?

java中将4字节的byte数组转成一个int值的工具方法如下: \x0d\x0a/** \x0d\x0a* @param byte[]\x0d\x0a* @return int\x0d\x0a*/ \x0d\x0apublic static int byteArrayToInt(byte[] b){ \x0d\x0a byte[] a = new byte[4]; \x0d\x0a int i = a.length – 1,j = b.length – 1; \x0d\x0a for (; i = 0 ; i–,j–) {//从b的尾部(即int值的低位)开始copy数据 \x0d\x0a if(j = 0) \x0d\x0a a[i] = b[j]; \x0d\x0a else \x0d\x0a a[i] = 0;//如果b.length不足4,则将高位补0 \x0d\x0a } \x0d\x0a int v0 = (a[0] 0xff)

回答于 2022-11-16

javabyte数组转换int数组

java如何将byte类型数组变成int类型的数组?

每4个byte转化成一个int,使用位运算,大致如下

大端序:

int[i] = byte[4*i]  24 | byte[4*i+1]  16 | byte[4*i+2]  8 | byte[4*i+3];

小端序:

int[i] = byte[4*i] | byte[4*i+1]  8 | byte[4*i+2]  16 | byte[4*i+3]  24;

如何把一个byte数组的数字转换成int

这里简单记录下两种转换方式:

第一种:

1、int与byte[]之间的转换(类似的byte short,long型)

[java] view plain copy 

/**  

    * 将int数值转换为占四个字节的byte数组,本方法适用于(低位在前,高位在后)的顺序。 和bytesToInt()配套使用 

    * @param value  

    *            要转换的int值 

    * @return byte数组 

    */    

public static byte[] intToBytes( int value )   

{   

    byte[] src = new byte[4];  

    src[3] =  (byte) ((value24)  0xFF);  

    src[2] =  (byte) ((value16)  0xFF);  

    src[1] =  (byte) ((value8)  0xFF);    

    src[0] =  (byte) (value  0xFF);                  

    return src;   

}  

 /**  

    * 将int数值转换为占四个字节的byte数组,本方法适用于(高位在前,低位在后)的顺序。  和bytesToInt2()配套使用 

    */    

public static byte[] intToBytes2(int value)   

{   

    byte[] src = new byte[4];  

    src[0] = (byte) ((value24)  0xFF);  

    src[1] = (byte) ((value16) 0xFF);  

    src[2] = (byte) ((value8)0xFF);    

    src[3] = (byte) (value  0xFF);       

    return src;  

}  

byte[]转int

[java] view plain copy 

/**  

    * byte数组中取int数值,本方法适用于(低位在前,高位在后)的顺序,和和intToBytes()配套使用 

    *   

    * @param src  

    *            byte数组  

    * @param offset  

    *            从数组的第offset位开始  

    * @return int数值  

    */    

public static int bytesToInt(byte[] src, int offset) {  

    int value;    

    value = (int) ((src[offset]  0xFF)   

            | ((src[offset+1]  0xFF)8)   

            | ((src[offset+2]  0xFF)16)   

            | ((src[offset+3]  0xFF)24));  

    return value;  

}  

  

 /**  

    * byte数组中取int数值,本方法适用于(低位在后,高位在前)的顺序。和intToBytes2()配套使用 

    */  

public static int bytesToInt2(byte[] src, int offset) {  

    int value;    

    value = (int) ( ((src[offset]  0xFF)24)  

            |((src[offset+1]  0xFF)16)  

            |((src[offset+2]  0xFF)8)  

            |(src[offset+3]  0xFF));  

    return value;  

}  

第二种:1、int与byte[]之间的转换(类似的byte

 short,long型)

[java] view plain copy 

 /**  

    * 将int数值转换为占四个字节的byte数组,本方法适用于(低位在前,高位在后)的顺序。  

    * @param value  

    *            要转换的int值 

    * @return byte数组 

    */    

public static byte[] intToBytes(int value)   

{   

    byte[] byte_src = new byte[4];  

    byte_src[3] = (byte) ((value  0xFF000000)24);  

    byte_src[2] = (byte) ((value  0x00FF0000)16);  

    byte_src[1] = (byte) ((value  0x0000FF00)8);    

    byte_src[0] = (byte) ((value  0x000000FF));          

    return byte_src;  

}  

byte[]转int

[java] view plain copy 

 /**  

    * byte数组中取int数值,本方法适用于(低位在前,高位在后)的顺序。 

    *   

    * @param ary  

    *            byte数组  

    * @param offset  

    *            从数组的第offset位开始  

    * @return int数值  

    */    

public static int bytesToInt(byte[] ary, int offset) {  

    int value;    

    value = (int) ((ary[offset]0xFF)   

            | ((ary[offset+1]8)  0xFF00)  

            | ((ary[offset+2]16) 0xFF0000)   

            | ((ary[offset+3]24)  0xFF000000));  

    return value;  

}

byte数组与int类型互相转换的几种方式

在剖析该问题前请看如下代码

public static String bytes2HexString(byte[] b) {

String ret = “”;

for (int i = 0; i b.length; i++) {

String hex = Integer.toHexString(b[ i ] 0xFF);

if (hex.length() == 1) {

hex = ‘0’ + hex;

}

ret += hex.toUpperCase();

}

return ret;

}

上面是将byte[]转化十六进制的字符串,注意这里b[ i ] 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出

b[ i ] 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.

其原因在于:

1.byte的大小为8bits而int的大小为32bits

2.java的二进制采用的是补码形式

在这里先温习下计算机基础理论

byte是一个字节保存的,有8个位,即8个0、1。

8位的第一个位是符号位,

也就是说0000 0001代表的是数字1

1000 0000代表的就是-1

所以正数最大位0111 1111,也就是数字127

负数最大为1111 1111,也就是数字-128

上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码

1、反码:

一个数如果是正,则它的反码与原码相同;

一个数如果是负,则符号位为1,其余各位是对原码取反;

2、补码:利用溢出,我们可以将减法变成加法

对于十进制数,从9得到5可用减法:

9-4=5 因为4+6=10,我们可以将6作为4的补数

改写为加法:

9+6=15(去掉高位1,也就是减10)得到5.

对于十六进制数,从c到5可用减法:

c-7=5 因为7+9=16 将9作为7的补数

改写为加法:

c+9=15(去掉高位1,也就是减16)得到5.

在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。

⑴一个数为正,则它的原码、反码、补码相同

⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1

– 1的原码为 10000001

– 1的反码为 11111110

+ 1

– 1的补码为 11111111

0的原码为 00000000

0的反码为 11111111(正零和负零的反码相同)

+1

0的补码为 100000000(舍掉打头的1,正零和负零的补码相同)

Integer.toHexString的参数是int,如果不进行0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,

例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。

和0xff相与后,高24比特就会被清0了,结果就对了。

—-

Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。

而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月26日 01:09:03
下一篇 2024年3月26日 01:15:09

相关推荐

  • c语言自定义函数数组求和,c语言自定义函数调用数组

    C语言数组怎样求和, 可以通过循环遍历数组中的每个元素,并进行累加。累加的结果可以保存在变量中,需要注意,要保证变量足够保存累加结果,不会出现溢出。 先获取数组长度,然后用for循环,从数组中获取值进行累加求和。 c语言中,定义数组后可以用sizeof命令获得数组的长度(即可容纳元素个数)。但是通过传递数组名参数到子函数中,以获得数组长度是不可行的,因为在子…

    2024年5月23日
    4500
  • java对数组计算,java数组计算时间复杂度

    Java中数组运算 1、很简单,因为你的数组是局部变量,只在那个声明它的方法里能用,解决办法是: 把它设置为属性; 作为方法的返回值。 2、将它们相加,并将结果存储到result数组中相应的位置。- 最后返回result数组即可。需要注意的是,上面的代码中我们使用了三元运算符 ? : 来判断数组的下标是否越界,如果越界则将值设为0。 3、public sta…

    2024年5月23日
    5200
  • c语言输入数组,C语言输入数组的方法

    如何用c语言从键盘输入10个数存入数组并求和? 1、用C语言编写一段程序,用来输入10个整数保存到数组中,求出这10个整数的和并输出。 2、,数组是相同数据类型的元素的集合。 2,数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。 3,数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。 3、void main(){ fl…

    2024年5月23日
    5100
  • java二维数组获得数据,java二维数组用法

    java中怎样用一位数组获得二维数组中某一行的值 利用 for循环遍历数组 即可 for循环是开界的。 Number : Name : A : B : Value;通过读取指定的列名,你可以得到,列名在数组中对应的索引值。 其实多维数组是在一维数组的基础上进行变换的,就拿二维数组来说,它是在一维数组上存储一维数组。 得到一维数组的长度lenth,如果长度为8…

    2024年5月23日
    4500
  • c语言输入参数数组的长度,c语言 数组参数

    C语言中关于数组长度 1、c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元素个数)。 2、因为数组中每个元素的类型都是一样的,在内存中所占的字节数都是相同的,所以总的字节数除以一个元素所占的字节数就是数组的长度。 3、C语言数组的长度是预先定义好的,在整个程序中固定不变。操作方法如下:首先,点击进人visual studio,然后新建一个c…

    2024年5月23日
    4800
  • c语言二维数组的指针,c语言二维数组的指针是什么

    C语言中“二维数组行指针”是什么意思 在C语言中,可以通过定义一个行数组指针,使得这个指针与二维数组名具有同样的性质,实现它们之间可以直接赋值。 数组名就是一个指针常量,它代表数组元素在内存相关信息。C语言 是一门通用计算机编程语言,应用广泛。 a即是它的行指针,a+0表示第0行的地址,a+1表示第1行地址…a[row]+col即列指针,列指针经过一次解引用…

    2024年5月23日
    4800
  • java数组增加元素,java 数组 添加元素

    java数组如何循环添加元素 在List中添加元素主要有以下几种方法:点击学习大厂名师精品课add(Objectobj):在列表的末尾添加元素obj。add(intindex,Objectobj):在指定下标index处添加元素obj。 一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度。 数组长度固定,插入以后原来的最后一个元素就被挤…

    2024年5月23日
    5300
  • c语言怎么输入数组,c语言怎么输入数组字符串

    如何用c语言从键盘输入10个数存入数组并求和? 1、用C语言编写一段程序,用来输入10个整数保存到数组中,求出这10个整数的和并输出。 2、,数组是相同数据类型的元素的集合。 2,数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。 3,数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。 3、void main(){ fl…

    2024年5月23日
    4000
  • c语言数组联系,c语言数组的问题

    C语言字符数组连接问题 1、str1和str2都是99个字节,如果str1内字符串的长度比较大,连接str2就会出现超出str1长度的可能,也就是溢出。可以把str1的长度定义大一些。 2、C语言中,字符类型char和整数类型在存储数据的格式上是相同的,都是采用补码存储数据。所不同的是,char只有一个字节,而int数据有四个字节。 3、实际上就是实现str…

    2024年5月23日
    4100
  • java将数据分类存进二维数组,java将二维数组保存在文件

    java怎么从mysql查询出来的结果转化为二维数组,举个例子 把你二维数组中的所有数据拼接起来,用“,”连接,组成一个长的字符串,存入数据库。进行其他操作时,可先将该字符串解析,原理和普通的字符串是一样的。 –这儿存在两种情况:字符串不存在分隔符号 字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔…

    2024年5月23日
    4300

发表回复

登录后才能评论



关注微信