android网络开发细节总结一

      在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了,结果就对了。
   

    

    

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章