byte是有符号的,我们看下如下操作。
byte data = -10
二进制补码(负数取反加1):11110110
运算1:
int dat2 = (int)((data & 0xff) << 1)
&运算结果会先变为字节,此时运算数据为纯字节,不存在符号位只是字节流,左移1位以后,为111101100,转为int后由于不存在符号位,故转int后为492。
运算2:
int dat1 = (int)(data << 1);
左移1位以后,为111101100,此时最后一位为符号位,保持符号位不变减一后取反为100010100,转int后为-20。
故做移位运算时,必须要先做运算 data & 0xff 再做移位,否则会有可能被判断为负数,移位运算时会认为是负数,导致结果不对。下面给出整数和byte数组的转换方法:
public byte[] longToBytes(long values) {
byte[] buffer = new byte[8];
for (int i = 0; i < 8; i++) {
int offset = LONG_BYTES - (i + 1) * 8;
buffer[i] = (byte) ((values >> offset) & 0xff);
}
return buffer;
}
//byte数组转long,从index开始,先转高位后转低位。
public long longFromBytes(byte[] input, int index) {
if ((index + 8) > input.length) {
return 0;
}
long value = 0;
for (int i = 0; i < 8; ++i) {
int offset = LONG_BYTES - (i + 1) * 8;
value = value | (((long) (input[index + i] & 0xff)) << offset);
}
return value;
}
public byte[] intToBytes(int values) {
byte[] buffer = new byte[4];
for (int i = 0; i < 4; i++) {
int offset = INT_BYTES - (i + 1) * 8;
buffer[i] = (byte) ((values >> offset) & 0xff);
}
return buffer;
}
public int intFromBytes(byte[] input, int index) {
if ((index + 4) > input.length) {
return 0;
}
int value = 0;
for (int i = 0; i < 4; ++i) {
int offset = INT_BYTES - (i + 1) * 8;
value = value | (((int) (input[index + i] & 0xff)) << offset);
}
return value;
}



