Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android網絡傳輸中的大小端轉換

android網絡傳輸中的大小端轉換

編輯:關於Android編程

大小端問題由來已久,和計算機的處理器有關。簡單來說,大端模式,是指數據的高位,保存在內存的低地址中,而數據的低位,保存在內存的高地址中,這樣的存儲模式有點兒類似於把數據當作字符串順序處理:地址由小向大增加,而數據從高位往低位放;小端模式,是指數據的高位保存在內存的高地址中,而數 據的低位保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。一般來說,這有些像吃甘庶,有些CPU喜歡從根部吃起,有些喜歡從頂部吃起,這原本不存在問題,讓你吃個char,有人從底部吃一節,有人從頂部吃一節,讓吃個short,有人從底部吃兩節,有人從頂部吃兩節。不過如果不同處理器的電腦用於數據交換,就會帶來問題,你很可能會嫌棄他換給你的甘庶不和你的口味,這時就要加工。這就是大小端轉換。網絡傳輸使用的是字節碼,單個byte組成的數組,要把二個字節的short或者四個字節int的內容,轉換成按大端或者小端排列的byte數組,轉換成適合對方口味的順序,就容易完成交換了。這就是大小端的來歷,一般來說,大羰的機器轉成的字節碼和小端的機器轉成的字節碼正好相反,反序排列一下,就可以實現互相通信。所以大小端的轉換比較簡單。函數如下:為了方便,int的len為4,short為2,byte為1,一個函數對應大端,一個函數對應小端。        
public static byte[] little_intToByte(int i, int len) {  
        byte[] abyte = new byte[len];  
        if (len == 1) {  
            abyte[0] = (byte) (0xff & i);  
        } else if (len == 2) {  
            abyte[0] = (byte) (0xff & i);  
            abyte[1] = (byte) ((0xff00 & i) >> 8);  
        } else {  
            abyte[0] = (byte) (0xff & i);  
            abyte[1] = (byte) ((0xff00 & i) >> 8);  
            abyte[2] = (byte) ((0xff0000 & i) >> 16);  
            abyte[3] = (byte) ((0xff000000 & i) >> 24);  
        }  
        return abyte;  
    }  
  
    public static int little_bytesToInt(byte[] bytes) {  
        int addr = 0;  
        if (bytes.length == 1) {  
            addr = bytes[0] & 0xFF;  
        } else if (bytes.length == 2) {  
            addr = bytes[0] & 0xFF;  
            addr |= (((int) bytes[1] << 8) & 0xFF00);  
        } else {  
            addr = bytes[0] & 0xFF;  
            addr |= (((int) bytes[1] << 8) & 0xFF00);  
            addr |= (((int) bytes[2] << 16) & 0xFF0000);  
            addr |= (((int) bytes[3] << 24) & 0xFF000000);  
        }  
        return addr;  
    }  
  
    /** 
     * int to byte[] 支持 1或者 4 個字節 
     *  
     * @param i 
     * @param len 
     * @return 
     */  
    public static byte[] big_intToByte(int i, int len) {  
        byte[] abyte = new byte[len];  
        ;  
        if (len == 1) {  
            abyte[0] = (byte) (0xff & i);  
        } else if (len == 2) {  
            abyte[0] = (byte) ((i >>> 8) & 0xff);  
            abyte[1] = (byte) (i & 0xff);  
        } else {  
            abyte[0] = (byte) ((i >>> 24) & 0xff);  
            abyte[1] = (byte) ((i >>> 16) & 0xff);  
            abyte[2] = (byte) ((i >>> 8) & 0xff);  
            abyte[3] = (byte) (i & 0xff);  
        }  
        return abyte;  
    }  
  
    public static int big_bytesToInt(byte[] bytes) {  
        int addr = 0;  
        if (bytes.length == 1) {  
            addr = bytes[0] & 0xFF;  
        } else if (bytes.length == 2) {  
            addr = bytes[0] & 0xFF;  
            addr = (addr << 8) | (bytes[1] & 0xff);  
        } else {  
            addr = bytes[0] & 0xFF;  
            addr = (addr << 8) | (bytes[1] & 0xff);  
            addr = (addr << 8) | (bytes[2] & 0xff);  
            addr = (addr << 8) | (bytes[3] & 0xff);  
        }  
        return addr;  
    }  

 

  這個是看大小端的函數:  
// 獲得本機CPU大小端  
    public static boolean isBigendian() {  
        short i = 0x1;  
        boolean bRet = ((i >> 8) == 0x1);  
        Log.i(tags, "bRet = " + bRet);  
        return bRet;  
    }  

 

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved