packagecom.joe.readwritemacs.tool;
/*** reference apache commonshttp://commons.apache.org/codec/**@authorAub**/public classHex {
/*** 用于建立十六进制字符的输出的小写字符数组*/private static final char[] DIGITS_LOWER= { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
/*** 用于建立十六进制字符的输出的大写字符数组*/private static final char[] DIGITS_UPPER= { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/*** 将字节数组转换为十六进制字符数组**@paramdata* byte[]*@return十六进制char[]*/public static char[] encodeHex(byte[] data) {
returnencodeHex(data, true);}
/*** 将字节数组转换为十六进制字符数组**@paramdata* byte[]*@paramtoLowerCase*true
传换成小写格式 ,false
传换成大写格式*@return十六进制char[]*/public static char[] encodeHex(byte[] data, booleantoLowerCase) {
returnencodeHex(data,toLowerCase ? DIGITS_LOWER: DIGITS_UPPER);}
/*** 将字节数组转换为十六进制字符数组**@paramdata* byte[]*@paramtoDigits* 用于控制输出的char[]*@return十六进制char[]*/protected static char[] encodeHex(byte[] data, char[] toDigits) {
intl = data.length;char[] out = new char[l << 1];// two characters form the hex value.for(inti = 0,j = 0;i < l;i++) {
out[j++] = toDigits[(0xF0& data[i]) >>> 4];out[j++] = toDigits[0x0F& data[i]];}
returnout;}
/*** 将字节数组转换为十六进制字符串**@paramdata* byte[]*@return十六进制String*/public staticString encodeHexStr(byte[] data) {
returnencodeHexStr(data, true);}
/*** 将字节数组转换为十六进制字符串**@paramdata* byte[]*@paramtoLowerCase*true
传换成小写格式 ,false
传换成大写格式*@return十六进制String*/public staticString encodeHexStr(byte[] data, booleantoLowerCase) {
returnencodeHexStr(data,toLowerCase ? DIGITS_LOWER: DIGITS_UPPER);}
/*** 将字节数组转换为十六进制字符串**@paramdata* byte[]*@paramtoDigits* 用于控制输出的char[]*@return十六进制String*/protected staticString encodeHexStr(byte[] data, char[] toDigits) {
return newString(encodeHex(data,toDigits));}
/*** 将十六进制字符数组转换为字节数组**@paramdata* 十六进制char[]*@returnbyte[]*@throwsRuntimeException* 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常*/public static byte[] decodeHex(char[] data) {
intlen = data.length;
if((len & 0x01) != 0) {
throw newRuntimeException("Odd number of characters.");}
byte[] out = new byte[len >> 1];
// two characters form the hex value.for(inti = 0,j = 0;j < len;i++) {
intf = toDigit(data[j],j) << 4;j++;f = f | toDigit(data[j],j);j++;out[i] = (byte) (f & 0xFF);}
returnout;}
/*** 将十六进制字符转换成一个整数**@paramch* 十六进制char*@paramindex* 十六进制字符在字符数组中的位置*@return一个整数*@throwsRuntimeException* 当ch不是一个合法的十六进制字符时,抛出运行时异常*/protected static inttoDigit(charch, intindex) {
intdigit = Character.digit(ch,16);if(digit == -1) {
throw newRuntimeException("Illegal hexadecimal character "+ ch
+ " at index "+ index);}
returndigit;}
public static voidmain(String[] args) {
String srcStr = "02A30307";//"待转换字符串";String encodeStr = encodeHexStr(srcStr.getBytes());String decodeStr = newString(decodeHex(encodeStr.toCharArray()));System.out.println("转换前:"+ srcStr);System.out.println("转换后:"+ encodeStr);System.out.println("还原后:"+ decodeStr);}
}