Java 十六進制(Hex)與byte數組之間的轉換(轉)


一、十六進制(Hex)與字節(byte)的概念
十六進制(Hex):計算機中數據的一種表示方法,它由0-9,A-F組成,字母不區分大小寫。與10進制的對應關系是:0-9對應0-9;A-F對應10-15。

字節(byte):   java中一個byte為8個二進制位。

轉換原理:

    每個二進制位有兩種狀態,分別為0,1

    因此,兩個二進制位有4種狀態,分別為:00,01,10,11

    三個二進制位有8種狀態,分別為000,001,010,011,100,101,110,111

    四個二進制位有十六種狀態,0000,0001......1110,1111.   即十六進制

 

    一個十六進制數(Hex),正好為4個二進制位。一個字節(byte)為8個二進制位。因此,一個字節可表示為兩個十六進制數字。

    因此,我們可以將一個byte用兩個Hex表示,同理,我們也可以將兩個Hex轉換為一個byte。

二、Java中Hex與byte的相互轉換
在java中,很多地方經常需要進行byte與Hex之間的轉換,比如:某些加密的過程(MD5),通信的過程(TCP)。

1.byte轉Hex

/** 
 * 字節轉十六進制 
 * @param b 需要進行轉換的byte字節 
 * @return  轉換后的Hex字符串 
 */  
public static String byteToHex(byte b){  
    String hex = Integer.toHexString(b & 0xFF);  
    if(hex.length() < 2){  
        hex = "0" + hex;  
    }  
    return hex;  
} 

很多時候,我們需要轉換的是一個byte數組,一個一個byte調用上面的方法顯然太麻煩。

/** 
 * 字節數組轉16進制 
 * @param bytes 需要轉換的byte數組 
 * @return  轉換后的Hex字符串 
 */  
public static String bytesToHex(byte[] bytes) {  
    StringBuffer sb = new StringBuffer();  
    for(int i = 0; i < bytes.length; i++) {  
        String hex = Integer.toHexString(bytes[i] & 0xFF);  
        if(hex.length() < 2){  
            sb.append(0);  
        }  
        sb.append(hex);  
    }  
    return sb.toString();  
}  
2.Hex轉byte 

需注意的是,Hex的字符串必須為十六進制的字符,否則會拋出異常。Hex的范圍為0x00到0xFF。

/** 
 * Hex字符串轉byte 
 * @param inHex 待轉換的Hex字符串 
 * @return  轉換后的byte 
 */  
public static byte hexToByte(String inHex){  
   return (byte)Integer.parseInt(inHex,16);  
}

如果Hex超過0xFF,顯然轉換后結果不是一個byte,而是一個byte數組

/** 
 * hex字符串轉byte數組 
 * @param inHex 待轉換的Hex字符串 
 * @return  轉換后的byte數組結果 
 */  
public static byte[] hexToByteArray(String inHex){  
    int hexlen = inHex.length();  
    byte[] result;  
    if (hexlen % 2 == 1){  
        //奇數  
        hexlen++;  
        result = new byte[(hexlen/2)];  
        inHex="0"+inHex;  
    }else {  
        //偶數  
        result = new byte[(hexlen/2)];  
    }  
    int j=0;  
    for (int i = 0; i < hexlen; i+=2){  
        result[j]=hexToByte(inHex.substring(i,i+2));  
        j++;  
    }  
    return result;   
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM