很多時候我們需要將字節數組轉化爲16進制字符串來保存,例如做I/O字節流操作的時候,尤其在很多加密的場景中應用都比較廣泛。
Java中byte用二進制表示佔用8位,而我們知道16進制的每個字符需要用4位二進制位來表示,所以我們就可以把每個byte轉換成兩個相應的16進制字符,即把byte的高4位和低4位分別轉換成相應的16進制字符H和L,並組合起來得到byte 轉換到16進制字符串的結果new String(H) + new String(L)。即byte用十六進制表示只佔2位。
從上面可以看出來我們只需要分別取出高四位和低四位的二進制值,然後進行相應的換算。
具體方案如下:
/** * 0x0F 十六進制F 相當於值 十進制 15,二進制表現形式爲 0000 1111 二進制 1 & 任何數是原數 二進制 0 & 任何數是0 * * @param b * @return */ public static String byteToHexString(Byte b) { final String HEX = "0123456789abcdef"; StringBuilder sb = new StringBuilder(); /** * 爲什麼要與0xof運算 因爲0xof的二進制是0000 1111,同時1&運算得出原數,0&運算得出0 */ // 1.取出字節b的高四位的數值並追加 // 把高四位向右移四位,與 0x0f運算得出高四位的數值 sb.append(HEX.charAt((b >> 4) & 0x0f)); // 2.取出低四位的值並追加 // 直接與 0x0f運算得出低四位的數值 sb.append(HEX.charAt(b & 0x0f)); return sb.toString(); }
總結如下:
(1)一個byte 對應兩位十六進制位,而不是八位(32位二進制位);
(2)轉化爲十六進制之後,不足兩位的,高位要補零。