1 /**
2 * reference apache commons http://commons.apache.org/codec/4 *5 *@authorAub6 *7 */
8 public classHex {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 *@paramdata26 * byte[]27 *@return十六进制char[]28 */
29 public static char[] encodeHex(byte[] data) {30 return encodeHex(data, true);31 }32
33 /**
34 * 将字节数组转换为十六进制字符数组35 *36 *@paramdata37 * byte[]38 *@paramtoLowerCase39 * true
传换成小写格式 , false
传换成大写格式40 *@return十六进制char[]41 */
42 public static char[] encodeHex(byte[] data, booleantoLowerCase) {43 return encodeHex(data, toLowerCase ?DIGITS_LOWER : DIGITS_UPPER);44 }45
46 /**
47 * 将字节数组转换为十六进制字符数组48 *49 *@paramdata50 * byte[]51 *@paramtoDigits52 * 用于控制输出的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 returnout;64 }65
66 /**
67 * 将字节数组转换为十六进制字符串68 *69 *@paramdata70 * byte[]71 *@return十六进制String72 */
73 public static String encodeHexStr(byte[] data) {74 return encodeHexStr(data, true);75 }76
77 /**
78 * 将字节数组转换为十六进制字符串79 *80 *@paramdata81 * byte[]82 *@paramtoLowerCase83 * true
传换成小写格式 , false
传换成大写格式84 *@return十六进制String85 */
86 public static String encodeHexStr(byte[] data, booleantoLowerCase) {87 return encodeHexStr(data, toLowerCase ?DIGITS_LOWER : DIGITS_UPPER);88 }89
90 /**
91 * 将字节数组转换为十六进制字符串92 *93 *@paramdata94 * byte[]95 *@paramtoDigits96 * 用于控制输出的char[]97 *@return十六进制String98 */
99 protected static String encodeHexStr(byte[] data, char[] toDigits) {100 return newString(encodeHex(data, toDigits));101 }102
103 /**
104 * 将十六进制字符数组转换为字节数组105 *106 *@paramdata107 * 十六进制char[]108 *@returnbyte[]109 *@throwsRuntimeException110 * 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常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 returnout;132 }133
134 /**
135 * 将十六进制字符转换成一个整数136 *137 *@paramch138 * 十六进制char139 *@paramindex140 * 十六进制字符在字符数组中的位置141 *@return一个整数142 *@throwsRuntimeException143 * 当ch不是一个合法的十六进制字符时,抛出运行时异常144 */
145 protected static int toDigit(char ch, intindex) {146 int digit = Character.digit(ch, 16);147 if (digit == -1) {148 throw new RuntimeException("Illegal hexadecimal character " +ch149 + " at index " +index);150 }151 returndigit;152 }153
154 public static voidmain(String[] args) {155 String srcStr = "待转换字符串";156 String encodeStr =encodeHexStr(srcStr.getBytes());157 String decodeStr = newString(decodeHex(encodeStr.toCharArray()));158 System.out.println("转换前:" +srcStr);159 System.out.println("转换后:" +encodeStr);160 System.out.println("还原后:" +decodeStr);161 }162
163 }