一、十六進制(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; }