Java byte數組與十六進制字符串互轉
轉自:http://aub.iteye.com/blog/1129228
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 /** 2 * reference apache commons <a 3 * href="http://commons.apache.org/codec/">http://commons.apache.org/codec/</a> 4 * 5 * @author Aub 6 * 7 */ 8 public class Hex { 9 10 /** 11 * 用於建立十六進制字符的輸出的小寫字符數組 12 */ 13 private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', 14 '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 15 16 /** 17 * 用於建立十六進制字符的輸出的大寫字符數組 18 */ 19 private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', 20 '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; 21 22 /** 23 * 將字節數組轉換為十六進制字符數組 24 * 25 * @param data 26 * byte[] 27 * @return 十六進制char[] 28 */ 29 public static char[] encodeHex(byte[] data) { 30 return encodeHex(data, true); 31 } 32 33 /** 34 * 將字節數組轉換為十六進制字符數組 35 * 36 * @param data 37 * byte[] 38 * @param toLowerCase 39 * <code>true</code> 傳換成小寫格式 , <code>false</code> 傳換成大寫格式 40 * @return 十六進制char[] 41 */ 42 public static char[] encodeHex(byte[] data, boolean toLowerCase) { 43 return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); 44 } 45 46 /** 47 * 將字節數組轉換為十六進制字符數組 48 * 49 * @param data 50 * byte[] 51 * @param toDigits 52 * 用於控制輸出的char[] 53 * @return 十六進制char[] 54 */ 55 protected static char[] encodeHex(byte[] data, char[] toDigits) { 56 int l = data.length; 57 char[] out = new char[l << 1]; 58 // two characters form the hex value. 59 for (int i = 0, j = 0; i < l; i++) { 60 out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; 61 out[j++] = toDigits[0x0F & data[i]]; 62 } 63 return out; 64 } 65 66 /** 67 * 將字節數組轉換為十六進制字符串 68 * 69 * @param data 70 * byte[] 71 * @return 十六進制String 72 */ 73 public static String encodeHexStr(byte[] data) { 74 return encodeHexStr(data, true); 75 } 76 77 /** 78 * 將字節數組轉換為十六進制字符串 79 * 80 * @param data 81 * byte[] 82 * @param toLowerCase 83 * <code>true</code> 傳換成小寫格式 , <code>false</code> 傳換成大寫格式 84 * @return 十六進制String 85 */ 86 public static String encodeHexStr(byte[] data, boolean toLowerCase) { 87 return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); 88 } 89 90 /** 91 * 將字節數組轉換為十六進制字符串 92 * 93 * @param data 94 * byte[] 95 * @param toDigits 96 * 用於控制輸出的char[] 97 * @return 十六進制String 98 */ 99 protected static String encodeHexStr(byte[] data, char[] toDigits) { 100 return new String(encodeHex(data, toDigits)); 101 } 102 103 /** 104 * 將十六進制字符數組轉換為字節數組 105 * 106 * @param data 107 * 十六進制char[] 108 * @return byte[] 109 * @throws RuntimeException 110 * 如果源十六進制字符數組是一個奇怪的長度,將拋出運行時異常 111 */ 112 public static byte[] decodeHex(char[] data) { 113 114 int len = data.length; 115 116 if ((len & 0x01) != 0) { 117 throw new RuntimeException("Odd number of characters."); 118 } 119 120 byte[] out = new byte[len >> 1]; 121 122 // two characters form the hex value. 123 for (int i = 0, j = 0; j < len; i++) { 124 int f = toDigit(data[j], j) << 4; 125 j++; 126 f = f | toDigit(data[j], j); 127 j++; 128 out[i] = (byte) (f & 0xFF); 129 } 130 131 return out; 132 } 133 134 /** 135 * 將十六進制字符轉換成一個整數 136 * 137 * @param ch 138 * 十六進制char 139 * @param index 140 * 十六進制字符在字符數組中的位置 141 * @return 一個整數 142 * @throws RuntimeException 143 * 當ch不是一個合法的十六進制字符時,拋出運行時異常 144 */ 145 protected static int toDigit(char ch, int index) { 146 int digit = Character.digit(ch, 16); 147 if (digit == -1) { 148 throw new RuntimeException("Illegal hexadecimal character " + ch 149 + " at index " + index); 150 } 151 return digit; 152 } 153 154 public static void main(String[] args) { 155 String srcStr = "待轉換字符串"; 156 String encodeStr = encodeHexStr(srcStr.getBytes()); 157 String decodeStr = new String(decodeHex(encodeStr.toCharArray())); 158 System.out.println("轉換前:" + srcStr); 159 System.out.println("轉換后:" + encodeStr); 160 System.out.println("還原后:" + decodeStr); 161 } 162 163 }