Java byte數組與十六進制字符串互轉


Java byte數組與十六進制字符串互轉
Java中byte用二進制表示佔用8位,而我們知道16進制的每個字符需要用4位二進制位來表示。
所以我們就可以把每個byte轉換成兩個相應的16進制字符,即把byte的高4位和低4位分別轉換成相應的16進制字符H和L,並組合起來得到byte轉換到16進制字符串的結果new String(H) + new String(L)。
同理,相反的轉換也是將兩個16進制字符轉換成一個byte,原理同上。
根據以上原理,我們就可以將byte[] 數組轉換爲16進制字符串了,當然也可以將16進制字符串轉換爲byte[]數組了。  
Hex類代碼如下:
  1. package base.codec;  

  2. /**

  3. * reference apache commons <a

  4. * href="http://commons.apache.org/codec/">http://commons.apache.org/codec/</a>

  5. *  

  6. * @author Aub

  7. *  

  8. */

  9. publicclass Hex {  

  10. /**

  11.     * 用於建立十六進制字符的輸出的小寫字符數組

  12.     */

  13. privatestaticfinalchar[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5',  

  14. '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };  

  15. /**

  16.     * 用於建立十六進制字符的輸出的大寫字符數組

  17.     */

  18. privatestaticfinalchar[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5',  

  19. '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  

  20. /**

  21.     * 將字節數組轉換爲十六進制字符數組

  22.     *  

  23.     * @param data

  24.     *            byte[]

  25.     * @return 十六進制char[]

  26.     */

  27. publicstaticchar[] encodeHex(byte[] data) {  

  28. return encodeHex(data, true);  

  29.    }  

  30. /**

  31.     * 將字節數組轉換爲十六進制字符數組

  32.     *  

  33.     * @param data

  34.     *            byte[]

  35.     * @param toLowerCase

  36.     *            <code>true</code> 傳換成小寫格式 , <code>false</code> 傳換成大寫格式

  37.     * @return 十六進制char[]

  38.     */

  39. publicstaticchar[] encodeHex(byte[] data, boolean toLowerCase) {  

  40. return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);  

  41.    }  

  42. /**

  43.     * 將字節數組轉換爲十六進制字符數組

  44.     *  

  45.     * @param data

  46.     *            byte[]

  47.     * @param toDigits

  48.     *            用於控制輸出的char[]

  49.     * @return 十六進制char[]

  50.     */

  51. protectedstaticchar[] encodeHex(byte[] data, char[] toDigits) {  

  52. int l = data.length;  

  53. char[] out = newchar[l << 1];  

  54. // two characters form the hex value.

  55. for (int i = 0, j = 0; i < l; i++) {  

  56.            out[j++] = toDigits[(0xF0 & data[i]) >>> 4];  

  57.            out[j++] = toDigits[0x0F & data[i]];  

  58.        }  

  59. return out;  

  60.    }  

  61. /**

  62.     * 將字節數組轉換爲十六進制字符串

  63.     *  

  64.     * @param data

  65.     *            byte[]

  66.     * @return 十六進制String

  67.     */

  68. publicstatic String encodeHexStr(byte[] data) {  

  69. return encodeHexStr(data, true);  

  70.    }  

  71. /**

  72.     * 將字節數組轉換爲十六進制字符串

  73.     *  

  74.     * @param data

  75.     *            byte[]

  76.     * @param toLowerCase

  77.     *            <code>true</code> 傳換成小寫格式 , <code>false</code> 傳換成大寫格式

  78.     * @return 十六進制String

  79.     */

  80. publicstatic String encodeHexStr(byte[] data, boolean toLowerCase) {  

  81. return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);  

  82.    }  

  83. /**

  84.     * 將字節數組轉換爲十六進制字符串

  85.     *  

  86.     * @param data

  87.     *            byte[]

  88.     * @param toDigits

  89.     *            用於控制輸出的char[]

  90.     * @return 十六進制String

  91.     */

  92. protectedstatic String encodeHexStr(byte[] data, char[] toDigits) {  

  93. returnnew String(encodeHex(data, toDigits));  

  94.    }  

  95. /**

  96.     * 將十六進制字符數組轉換爲字節數組

  97.     *  

  98.     * @param data

  99.     *            十六進制char[]

  100.     * @return byte[]

  101.     * @throws RuntimeException

  102.     *             如果源十六進制字符數組是一個奇怪的長度,將拋出運行時異常

  103.     */

  104. publicstaticbyte[] decodeHex(char[] data) {  

  105. int len = data.length;  

  106. if ((len & 0x01) != 0) {  

  107. thrownew RuntimeException("Odd number of characters.");  

  108.        }  

  109. byte[] out = newbyte[len >> 1];  

  110. // two characters form the hex value.

  111. for (int i = 0, j = 0; j < len; i++) {  

  112. int f = toDigit(data[j], j) << 4;  

  113.            j++;  

  114.            f = f | toDigit(data[j], j);  

  115.            j++;  

  116.            out[i] = (byte) (f & 0xFF);  

  117.        }  

  118. return out;  

  119.    }  

  120. /**

  121.     * 將十六進制字符轉換成一個整數

  122.     *  

  123.     * @param ch

  124.     *            十六進制char

  125.     * @param index

  126.     *            十六進制字符在字符數組中的位置

  127.     * @return 一個整數

  128.     * @throws RuntimeException

  129.     *             當ch不是一個合法的十六進制字符時,拋出運行時異常

  130.     */

  131. protectedstaticint toDigit(char ch, int index) {  

  132. int digit = Character.digit(ch, 16);  

  133. if (digit == -1) {  

  134. thrownew RuntimeException("Illegal hexadecimal character " + ch  

  135.                    + " at index " + index);  

  136.        }  

  137. return digit;  

  138.    }  

  139. publicstaticvoid main(String[] args) {  

  140.        String srcStr = "待轉換字符串";  

  141.        String encodeStr = encodeHexStr(srcStr.getBytes());  

  142.        String decodeStr = new String(decodeHex(encodeStr.toCharArray()));  

  143.        System.out.println("轉換前:" + srcStr);  

  144.        System.out.println("轉換後:" + encodeStr);  

  145.        System.out.println("還原後:" + decodeStr);  

  146.    }  

  147. }

參考org.apache.commons.codec.binary.Hex
下載地址:
http://commons.apache.org/codec/download_codec.cgi
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章