前言
最近在項(xiàng)目中需要將字節(jié)數(shù)組轉(zhuǎn)換成十六進(jìn)制字符串遵堵,而Java內(nèi)置的庫(kù)中并沒有相關(guān)工具可用钉稍,因此查了一下byte數(shù)組轉(zhuǎn)hex字符串的相關(guān)方法焙畔,列出如下捎琐,需要可以直接拿來使用。
方法1:使用String.format
public static String encodeHexString(byte[] data) {
StringBuilder sb = new StringBuilder();
for (byte b : data) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
方法2:使用Formatter
public static String encodeHexString(byte[] data) {
Formatter formatter = new Formatter();
for (byte b : data) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
方法3:使用字節(jié)字符映射
public static String encodeHexString(byte[] data) {
char[] hexArray = "0123456789abcdef".toCharArray();
char[] out = new char[data.length * 2];
for (int i = 0; i < data.length; i++) {
int v = data[i] & 0xFF;//取byte的后八位
out[i * 2] = hexArray[v >>> 4];
out[i * 2 + 1] = hexArray[v & 0x0F];
}
return new String(out);
}
此處需要注意的是叉庐,Java中byte是有符號(hào)的舒帮,在將byte轉(zhuǎn)為int時(shí),int類型的值也會(huì)把這個(gè)符合帶上。以-1為例玩郊,byte和int的二進(jìn)制表示如下:
byte a = -1;//11111111
int b = -1;//11111111111111111111111111111111
因此需要用0xFF
屏蔽其他字節(jié)肢执,只取byte后八位,即int v = data[i] & 0xFF;
译红。此處極容易忽略該問題而導(dǎo)致代碼寫錯(cuò)预茄,因此一般來說不推薦這種寫法。
方法4:使用commons-codec
引入commons-codec
的maven依賴:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
使用方法如下:
import org.apache.commons.codec.binary.Hex;
byte[] data = {0xa, -0x3, 0xf, 0x0};
String hexString = Hex.encodeHexString(data);
System.out.println(hexString);
查看Hex.encodeHexString
中的源碼侦厚,我們可以看到該方法的實(shí)現(xiàn)與方法3是類似的耻陕,即通過字節(jié)字符的映射來實(shí)現(xiàn)。
總結(jié)
以上介紹了Java中將字節(jié)數(shù)組轉(zhuǎn)化成十六進(jìn)制字符串的4種方法刨沦,需要的話可以直接拿來使用诗宣。個(gè)人推薦使用方法1和方法4:當(dāng)Java項(xiàng)目中沒有commons-codec
依賴時(shí),直接使用方法1是最方便的想诅,而且可以減少依賴數(shù)量梧田,避免引入新的jar包;當(dāng)項(xiàng)目中有使用commons-codec
時(shí)侧蘸,直接使用方法4調(diào)用jar包中方法是很方便直接的。方法1容易理解且不容易出錯(cuò)鹉梨,方法4已經(jīng)由其他人幫我們封裝好了實(shí)現(xiàn)讳癌,因此避免了我們自己實(shí)現(xiàn)而可能導(dǎo)致的出錯(cuò)。
參考鏈接: