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