这里有个方法,是把一个网络传输上的4个字节转为一个整型数,如00CCBBDD 转为整型数就是DDBBCC00, 网络上是低字节在前,操作系统是高字节在前。
/**
* 字节数组转换为整型数, 低字节在前
* @param b 字节数组
* @return 整型数
*/
public static int byte2Int(byte[] b)
{
int ret = 0;
int min = Math.min(4, b.length);
for(int i=0; i<min; i++) {
ret += b[min-i-1];
if(i<min-1) ret<<=8;
}
return ret;
}
函数很简单,但运行的结果却不对,如00CCBBDD 转的结果却是 DCBACC00,我想了很久才知道答案,请各位思考一下,相信你一定能找到答案。PS:这个问题是很隐蔽的,说不定你在平时的编程中就会遇到。
/**
* 字节数组转换为整型数, 低字节在前
* @param b 字节数组
* @return 整型数
*/
public static int byte2Int(byte[] b)
{
int ret = 0;
int min = Math.min(4, b.length);
for(int i=0; i<min; i++) {
ret += b[min-i-1];
if(i<min-1) ret<<=8;
}
return ret;
}
函数很简单,但运行的结果却不对,如00CCBBDD 转的结果却是 DCBACC00,我想了很久才知道答案,请各位思考一下,相信你一定能找到答案。PS:这个问题是很隐蔽的,说不定你在平时的编程中就会遇到。
解决方案 »
- 如何在一画板上实现双击添加文本框?
- 帮忙看一下这个换背景的窗体
- equals 重载问题
- Java的两种数据类型,primitive,referance.请指教!
- 连接SQL SERVER数据库的问题!!
- -------------关于Jtree!!-----------
- 请问如何利用HttpClient建立一个可以模拟用户访问Https服务器的客户端工具?
- html页面中java Applet与javascript通信的问题
- StringTokenizer的怪现象
- 我正在赶往程序员的途中。。。途中迷茫。。彷徨。。失去方向 想哥哥们能带我达到目的地 5555555555555555555555555555555555555555555555
- 给各位CSDN兄弟们出几道题.给出答案的同时希望你们说说自己的看法。最近分不是很多就80了不要嫌少哦!!!
- 不理解 write 方法
大于127的转化为int时前面全部补 1
小于128的转化为int时前面全部补 0
应改为
public static int byte2Int(byte[] b)
{
int ret = 0;
int min = Math.min(4, b.length);
for(int i=0; i<min; i++) {
if(b[min-1-i]<0)
ret +=256+ (int)b[min-i-1];
else
ret +=(int)b[min-i-1];
if(i<min-1) ret<<=8;
}
return ret;
}
* 将 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);
}/**
* 将 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);
}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;
}
这位正解,byte是有符号的。强制转换的时候很容易忽略这点。负数强制转换的时候前面是补1的。不信你测试下面的代码: int a = 0xbb;
System.out.println(Integer.toHexString(a)); //输出 bb
int b = (int) 0xbb;
System.out.println(Integer.toHexString(b)); //输出 ffffffbb
所以上面的代码只需要做一个小小的修改就可以。 /**
* 字节数组转换为整型数, 低字节在前
* @param b 字节数组
* @return 整型数
*/
public static int byte2Int(byte[] b)
{
int ret = 0;
int min = Math.min(4, b.length);
for(int i=0; i<min; i++) {
ret += 0x000000FF & b[min-i-1];
if(i<min-1) ret<<=8;
}
return ret;
}结贴咯···