字節數組與16進制字符串的相互轉換

衆所周知,二進制數據(包括內存地址)在計算機中通常以16進制的方式表示,你們也習慣使用16進制來查看、記錄二進制數據,因此看了一下Java中字節與16進制的相互轉換。由於大多數狀況下咱們遇到的都是字節數組,因此本文是以字節數據與16進制字符串的相互轉換爲例。算法

先說一下看字節與16進制轉換問題的原因。在項目中,我準備寫一個MD5的工具方法,使用的是JDK自帶的 MessageDigest 信息摘要類,代碼以下:數組

MessageDigest md5Digest = MessageDigest.getInstance("MD5");
byte[] btArr = md5Digest.digest(str.getBytes());

很明顯,我在調用了信息摘要方法以後,獲得的是一個字節數組 byte[] ,而我想要的 MD5 方法應該是像大多數md5工具同樣,返回一個 32 位的字符串。工具

簡單查了一下,才知道原來 MD5 信息摘要算法返回的結果是一個 128 bit 的二進制數據,128 bit 正好是 16個 byte,而1個byte轉成16進制正好是2位(16進制使用4個bit,一個byte有8個bit),因此MD5算法返回的128bit 轉成 16進制就正好是 32位。spa

聽着可能有點繞,簡單的說,上述代碼中md5信息摘要以後,返回了一個有 16個字節的字節數組,而如今須要作的就是把這個字節數組轉成16進制格式的數據。code

 

回到正題,字節與16進制相互轉換的代碼以下:blog

public class HexTest {

    private static final char HexCharArr[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

    private static final String HexStr = "0123456789abcdef";

    public static String byteArrToHex(byte[] btArr) {
        char strArr[] = new char[btArr.length * 2];
        int i = 0;
        for (byte bt : btArr) {
            strArr[i++] = HexCharArr[bt>>>4 & 0xf];
            strArr[i++] = HexCharArr[bt & 0xf];
        }
        return new String(strArr);
    }

    public static byte[] hexToByteArr(String hexStr) {
        char[] charArr = hexStr.toCharArray();
        byte btArr[] = new byte[charArr.length / 2];
        int index = 0;
        for (int i = 0; i < charArr.length; i++) {
            int highBit = HexStr.indexOf(charArr[i]);
            int lowBit = HexStr.indexOf(charArr[++i]);
            btArr[index] = (byte) (highBit << 4 | lowBit);
            index++;
        }
        return btArr;
    }
}
byteArrToHex 字節數組轉成16進制字符串
基本的算法是:把一個字節分紅高4位的bit和低4位的bit,先取高4位的bit,獲得這4位bit對應的數字(範圍在0~15),就能夠知道對應的16進制數是多少了;按一樣的方式取到低4位bit對應的16進制數,把這些16進制數放到一個數組裏,最後串成一個字符串,就獲得了咱們須要的16進制字符串。

hexToByteArr 16進制字符串轉成字節數組
基本的算法是:把16進制字符串分紅一個的char數組,循環取其中的兩個char,這兩個char的值必定都是在[0123456789abcdef]之間;先找到第一個char對應的下標位置,好比說char的值爲 a,那麼下標位置就是 10,把數字10轉
成byte類型,取低4位bit,而後用一樣的方式找到第二個char對應的下標數字,取到該數字的低4位bit;將剛纔取到的兩個低4位bit拼在一塊兒,第一個char對應的4位bit爲字節的高4位,第二個char對應的4位bit爲字節的低4位,這樣組成一個完整的8bit字節;循環完char數組,就獲得了16進制字符串對應的字節數組。

因16進制只需佔用4個bit,而一個字節有8個bit,因此字節轉16進制的時候須要拆開來轉換,一個字節對應兩個16進制字符;而16進制字符串轉成字節的時候,須要用兩個16進制數對應的bit拼接起來才能組成一個完整的字節,轉換後獲得的字節數組的長度是16進制字符串長度的一半。
(完)
相關文章
相關標籤/搜索