long iii = (unsigned4BytesToInt(copyBrr(ob, 20), 0) << 32)&0xFFFFFFFFL; 是不是后面少写了8个F啊? long iii = (unsigned4BytesToInt(copyBrr(ob, 20), 0) << 32)&0xFFFFFFFFFFFFFFFFL; ?
long iii = (unsigned4BytesToInt(copyBrr(ob, 20), 0)<< 32)&0xFFFFFFFFFFFFFFFFL; System.out.println(Long.toBinaryString(iii));结果:10011101100010101010100000000100000000000000000000000000000000,这是你期望得到的结果吗?
8好意思,这里说错了,|运算不会发生进位,把|运算相当然成+运算,所以最后的结果 &0xffffffffL是没问题的int a = Integer.MAX_VALUE + 1; int b = Integer.MAX_VALUE + 1; long c = (a | b) & 0xffffffffL; //把|改成+就不一样了 System.out.println(c); long d = (a & 0xffffffffL) | (b & 0xffffffffL); //把|改成+就不一样了 System.out.println(d);
public class testJe {
public static void main(String[] args) {
//4294967296
byte[] ob = new byte[]{0,50,0,17,33,64,-83,118,-2,-15,0,0,13,-7,127,0,68,-26,22,13,1,-86,98,39,1,1,14,0,0,0,0,0,0,0};
byte[] tob = copyBrr(ob, 20);
long iii = (unsigned4BytesToInt(copyBrr(ob, 20), 0) << 32)&0xFFFFFFFFL;
System.out.println(iii);
}
public static byte[] copyBrr(byte[] inBrr,int n){
byte[] outBrr=null;
//容错处理
if(null==inBrr){
return null;
}else{
if(n>=0&&n<inBrr.length){
outBrr=new byte[inBrr.length-n];
//outArr=Arrays.copyOfRange(inArr, n,inArr.length); //jdk1.4中无此方法
for(int i=0;i<outBrr.length;i++){
outBrr[i]=inBrr[n+i];
}
}else if(n<0){
outBrr = inBrr;
}else if(n>inBrr.length){
outBrr = null;
}
}
return outBrr;
}
public static long unsigned4BytesToInt(byte buf[], int index) {
int firstByte = (0x000000FF & ((int) buf[index]));
int secondByte = (0x000000FF & ((int) buf[index + 1]));
int thirdByte = (0x000000FF & ((int) buf[index + 2]));
int fourthByte = (0x000000FF & ((int) buf[index + 3]));
long unsignedLong = ((long) (firstByte | secondByte << 8 | thirdByte << 16 | fourthByte << 24)) & 0xFFFFFFFFL;
return unsignedLong;
}
曾这样写过,但遇到大的数,这样转换就不对了
long i64 = (long)(ob[20]<<32); //*(ob+20)相当于数组的ob[20]
应该是 long i64 = (long)ob[20]<<32;
强制类型转换优先级高于 位移运算符
long unsignedLong = ((long) (firstByte | secondByte << 8 | thirdByte << 16 | fourthByte << 24)) & 0xFFFFFFFFL;改成
long unsignedLong = (firstByte & 0xFFFFFFFFL) | ((secondByte & 0xFFFFFFFFL) << 8) | ((thirdByte & 0xFFFFFFFL) << 16) | ((fourthByte & 0xFFFFFFFL) << 24);LZ好好想想其中的区别
是不是后面少写了8个F啊?
long iii = (unsigned4BytesToInt(copyBrr(ob, 20), 0) << 32)&0xFFFFFFFFFFFFFFFFL; ?
System.out.println(Long.toBinaryString(iii));结果:10011101100010101010100000000100000000000000000000000000000000,这是你期望得到的结果吗?
8好意思,这里说错了,|运算不会发生进位,把|运算相当然成+运算,所以最后的结果 &0xffffffffL是没问题的int a = Integer.MAX_VALUE + 1;
int b = Integer.MAX_VALUE + 1;
long c = (a | b) & 0xffffffffL; //把|改成+就不一样了
System.out.println(c);
long d = (a & 0xffffffffL) | (b & 0xffffffffL); //把|改成+就不一样了
System.out.println(d);