将一个byte数组转换成int?

lixj2009 2009-05-28 12:18:50
如何将一个byte[] b={50,56,48,48};之后将它里面的50,56,48,48按这个顺序组合成一个整数值?高手指点
...全文
1249 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
aa337235017 2012-06-19
  • 打赏
  • 举报
回复
江湖郎中也太多了吧,一个个试过去没一个是对的,
Sodino 2011-01-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bao110908 的回复:]
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;
}

[/Quote]
此算法在转换成Little Endian时当且仅当start的数值是4的倍数时才是正确的
修改如下:


for (int i = start, k = start + len % (Integer.SIZE / Byte.SIZE + 1); i < k; i++) {
//((i - start) % 4))亦可只写为(i - start)
tmp |= (data[i] & 0xff) << ((isBigEndian ? (k - i - 1)
: ((i - start) % 4)) * Byte.SIZE);
}
  • 打赏
  • 举报
回复
因为不知道你的这个 byte 数组的字节序如何,所以没办法写出符合你要求的转换方法,
比如说:50,56,48,48,那 50 是 int 的高位字节,还是低位字节呢?

如果是 50 作为 int 数据的高字节,那么可以采用下面的含有 BE 的方法。

下面这段代码中的转换可以适合 BE 和 LE 序,并且可以挑选字节数组中的几个字节进行转换。

Java 序列化时的字节序采用 Big-Endian,即大端序。

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;
}
}
lixj2009 2009-05-28
  • 打赏
  • 举报
回复
是这个意思
knightzhuwei 2009-05-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zoutuo 的回复:]
什么是将它里面的50,56,48,48按这个顺序组合成一个整数值
[/Quote]
LZ的意思应该是int是四字节 现在它的第一个字节是50 第二个字节是56 第三和第四个字节是48 问这个int值是多少
baetg 2009-05-28
  • 打赏
  • 举报
回复
int[] b={50,56,48,48};
kokobox 2009-05-28
  • 打赏
  • 举报
回复

int sum = 0;
byte[] b={50,56,48,48};
for(int i = 0 ; i <4 ; i++){
int temp =((int)b[i])&0xff;
temp <<= i*8;
sum = temp + sum;
}
System.out.println(sum);


zoutuo 2009-05-28
  • 打赏
  • 举报
回复
什么是将它里面的50,56,48,48按这个顺序组合成一个整数值
cai36032075 2009-05-28
  • 打赏
  • 举报
回复
不知道字符串拼接可不可以,先转化成String类型
knightzhuwei 2009-05-28
  • 打赏
  • 举报
回复
参考http://blog.csdn.net/zjsjava/archive/2007/08/15/1745707.aspx

public static int byteToInt2(byte[] b) {

int mask=0xff;
int temp=0;
int n=0;
for(int i=0;i<4;i++){
n<<=8;
temp=b[i]&mask;
n|=temp;
}
return n;
}


huosidun0302 2009-05-28
  • 打赏
  • 举报
回复
lixj2009 2009-05-28
  • 打赏
  • 举报
回复
LS和JAVA源码差不多,不错不错
Monkey_D_Luffy 2009-05-28
  • 打赏
  • 举报
回复
不错啊

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧