在android开发中我们会碰到文件的传输,这个时候我们就会牵涉到数据的传输。比如一个文件的大小是1024kb,此时数据类型是int,而网络上的数据都是byte数据流,这就需要一个int-> byte[]的方法了。。好了直接上个简单的例子。
public class Integer2Byte {
public static void main(String[] args) throws Exception {
int i = 1989;
byte[] buf = i2b2(i);
for(byte b : buf) {
System.out.print(b+" " );
}
}
//算法是用来干嘛的,就是为了提升性能啊,哈哈!
public static byte[] i2b1(int i) {
byte[] result = new byte[4];
result[0] = (byte)((i >> 24) & 0xFF);
result[1] = (byte)((i >> 16) & 0xFF);
result[2] = (byte)((i >> 8) & 0xFF);
result[3] = (byte)(i & 0xFF);
return result;
}
//第二种方法相信大家看了,然后查下api就知道了。
public static byte[] i2b2(int i) throws Exception {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(buf);
out.writeInt(i);
byte[] b = buf.toByteArray();
out.close();
buf.close();
return b;
}
}
在这里大家又会疑问到为什么要与0xFF进行与运算呢??自己看了以前的资料和网上的资料后总结了下,相信对我们基础知识薄弱的人还是有点帮助的。
原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式
3.0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
举个简单的例子说明下:
当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111,即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。