Android 下 int to byte 和byte to int
int to byte
Android系统int 为4个字节,byte为一个字节,inttobyte 只需将int每个字节截开就可以;
int k4=0x1a2b3f;
byte [] bita=newbyte[4];
bita[0]=(byte) ((k4 & 0xff000000)>>24);
bita[1]=(byte) ((k4 & 0x00ff0000)>>16);
bita[2]=(byte) ((k4 & 0x0000ff00)>>8);
bita[3]=(byte) (k4 & 0xff);
bita的结果是0 1a 2b 3f
反过来的byte toint直接转换是不行的,应为java中没有unsigned 这种定义,即最高位是符号位。当byte强转为int时符号位就可能出错,应为小于0x80的可以直接转,大于0x80的是错误的。所以
byte [] bit=newbyte[4];
bit[0]=0x01;
bit[1]=0x73;
bit[2]=(byte)0x83;
bit[3]=(byte)0xa3;
int k4=((int)(bit[0])<< 24) + (((int)bit[1]) << 16) + (((int)bit[2]) << 8) +bit[3];是错误的。
结果是k4= 24281763
而 0x017383a3 的十进制是24347555
byte 0x83 强转为int 后是 -125。 而不是131
0x83 二进制为 1000 0011 强转为int是最高为被Android认为是符号位
就转成了 1111 1111 1111 1111 1111 1111 1000 0011 ,经过反码,补码变化(取反加一) 内存中变为 1000 0000 0000 0000 00000 0000 0111 1101 ,最高位是符号位,
0111 1101 是125,0x83 就有131 变成了-125;
所以k4 = 1*2^24 + 115*2^26 +(-125)*2^8 +(-93 )= 24281763
Eclipse 中的提示
(大于等于0x80的提示错误)
正确的转换应该是
byte [] b=newbyte[4];
b[0]=0x01;
b[1]=0x73;
b[2]=(byte)0x83;
b[3]=(byte)0xa3;
int [] b1 =new int [4];
for(int i=0;i<4;i++)
{
if(b[i]<0)
b1[i] = (int)(b[i] &0x7f) + 128;
else
b1[i]= (int) b[i];
}
return ((b1[0]) << 24) + ((b1[1])<< 16) + ((b1[2]) << 8) + b1[3];
当最高位是一时,被Android认为是负数,先b[i] &0x7f将符号位去除,强转为int ,再加上128;
例如 0x83二进制为 1000 0011经过 &0x7f 后 ,变为 0000 0011 ,强转为int 变成 0000 0000 0000 0000 00000 0000 0000 0011 ,再加上128(1000 000)将去除的第8位补上
http://download.csdn.net/detail/xiang3420/7975213
资源上加红的那一行写错了,当时没改完