1. 程式人生 > >Java 十六進位制(Hex)與byte陣列之間的轉換

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;   
}  

都是靜態方法,複製貼上直接用就可以了。喜歡的同學請點贊!