首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 十六進制與字串互轉工具類:完整實現與原理解析

     編輯:Java 相關知識

專案開發中頻繁遇到位元組陣列與十六進制字串互轉需求:網路協定解析、加密演算法輸出、日誌記錄等。本文提供一個生產就緒的工具類,涵蓋四大核心場景,代碼經過實戰驗證,可直接納入專案公共庫。

核心功能一覽

方法用途輸入輸出
printHexString控制台輸出十六進制提示字串 + byte[]void
bytesToHexString位元組陣列轉十六進制字串byte[]String (大寫,無分隔)
uniteBytes兩 ASCII 字符合併為一位元組byte high, byte lowbyte
hexStringToBytes十六進制字串轉位元組陣列String (長度為 16)byte[8]

關鍵實現細節

1. 位元組 → 十六進制字串

public static String bytesToHexString(byte[] bytes) {
    StringBuilder sb = new StringBuilder(bytes.length * 2);
    for (byte b : bytes) {
        String hex = Integer.toHexString(b & 0xFF);
        if (hex.length() == 1) sb.append('0');
        sb.append(hex.toUpperCase());
    }
    return sb.toString();
}

關鍵點:b & 0xFF 將有符號位元組轉為無符號整數(0-255),避免負數導致的符號擴展;StringBuilder 替代字串拼接,提升效能。

2. 十六進制字串 → 位元組陣列

public static byte[] hexStringToBytes(String hex) {
    int len = hex.length();
    byte[] result = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        result[i / 2] = uniteBytes(
            (byte) hex.charAt(i),
            (byte) hex.charAt(i + 1)
        );
    }
    return result;
}

private static byte uniteBytes(byte high, byte low) {
    int h = Character.digit((char) high, 16);
    int l = Character.digit((char) low, 16);
    return (byte) ((h << 4) | l);
}

改進點:原版固定輸出 8 位元組,新版支援任意偶數長度;使用 Character.digit 替代 Byte.decode,效能更高且無異常拋出開銷。

使用範例

byte[] data = {0x2B, 0x44, (byte)0xEF, (byte)0xD9};
String hex = bytesToHexString(data);  // "2B44EFD9"
byte[] restored = hexStringToBytes(hex); // 還原原陣列

生產環境建議

  • 引入 Apache Commons Codec 的 Hex 類:Hex.encodeHexString(bytes) / Hex.decodeHex(hex.toCharArray()),經過大規模生產驗證
  • JDK 17+ 可使用 java.util.HexFormat:HexFormat.of().formatHex(bytes) / HexFormat.of().parseHex(hex)
  • 若需自行維護,請補充單元測試覆蓋:空陣列、奇數長度字串、非十六進制字符、大小寫混合等邊界情況
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved