一、十六進制(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;
}
都是靜態方法,復制粘貼直接用就可以了。
---------------------
作者:極光舞者
來源:CSDN
原文:https://blog.csdn.net/qq_34763699/article/details/78650272
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
