1、十六進制(Hex)與字節(byte)的概念java
十六進制(Hex):計算機中數據的一種表示方法,它由0-9,A-F組成,字母不區分大小寫。與10進制的對應關係是:0-9對應0-9;A-F對應10-15。數組
字節(byte): java中一個byte爲8個二進制位。app
轉換原理:加密
每一個二進制位有兩種狀態,分別爲0,1.net
所以,兩個二進制位有4種狀態,分別爲:00,01,10,11blog
三個二進制位有8種狀態,分別爲000,001,010,011,100,101,110,111字符串
四個二進制位有十六種狀態,0000,0001......1110,1111. 即十六進制string
一個十六進制數(Hex),正好爲4個二進制位。一個字節(byte)爲8個二進制位。所以,一個字節可表示爲兩個十六進制數字。原理
所以,咱們能夠將一個byte用兩個Hex表示,同理,咱們也能夠將兩個Hex轉換爲一個byte。二進制
2、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; }