在 Java 開發中,將位元組陣列轉換為十六進制字串是常見需求,例如處理二進位資料、加密雜湊值輸出或網路封包分析。本文提供一個高效、無依賴的實作方式,並說明核心邏輯。
每個 byte 佔 8 位元,可拆分為高 4 位與低 4 位,分別對應十六進制的一個字元 (0-9, a-f)。透過位元遮罩與位移運算,即可取得對應的十六進制字元。
package com.goodfan;
public class ByteArrayToHexString {
private static final char[] HEX_CHARS = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
/**
* 將 byte 陣列轉為十六進制字串,每兩個字元之間以空格分隔
* @param data 待轉換的位元組陣列
* @return 格式化後的十六進制字串
*/
public static String bytesToHexString(byte[] data) {
if (data == null || data.length == 0) {
return "";
}
StringBuilder sb = new StringBuilder(data.length * 3); // 預估容量:每 byte 2 字元 + 1 空格
for (int i = 0; i < data.length; i++) {
// 取高 4 位 (0xf0 = 11110000) 右移 4 位
sb.append(HEX_CHARS[(data[i] & 0xf0) >>> 4]);
// 取低 4 位 (0x0f = 00001111)
sb.append(HEX_CHARS[data[i] & 0x0f]);
// 非最後一個 byte 時加入空格分隔
if (i < data.length - 1) {
sb.append(' ');
}
}
return sb.toString();
}
public static void main(String[] args) {
byte[] data = "hello kitty".getBytes();
System.out.println("原始位元組陣列參考: " + data); // 印出物件參考位址
String hexString = bytesToHexString(data);
System.out.println("十六進制字串: " + hexString);
// 輸出範例: 68 65 6c 6c 6f 20 6b 69 74 74 79
}
}
data[i] & 0xf0 保留高半位元組,>> 4 將其移至低 4 位;data[i] & 0x0f 直接取得低半位元組。HEX_CHARS 陣列避免重複建立字串物件,效能優於 String.format 或 Integer.toHexString。若使用 JDK 17 或更新版本,可直接使用 java.util.HexFormat 簡化程式碼:
import java.util.HexFormat;
String hex = HexFormat.ofDelimiter(" ").formatHex(data);
// 或不加分隔符: HexFormat.of().formatHex(data)
此 API 內建執行緒安全、效能優異,為現代 Java 專案的首選。