Java byte数组与十六进制字符串互转
博客分类:JavaJavajava 十六进制java hex
Java 加密解密基础
Java byte数组与十六进制字符串互转
Java BASE64加密解密
Java 加密解密之消息摘要算法(MD5 SHA MAC)
Java 加密解密之对称加密算法DES
Java 加密解密之对称加密算法DESede
Java 加密解密之对称加密算法AES
Java 加密解密之对称加密算法PBE
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类代码如下:
Java代码
/***referenceapachecommons<a*href="/codec/">/codec/</a>**@authorAub**/publicclassHex{/***用于建立十六进制字符的输出的小写字符数组*/privatestaticfinalchar[]DIGITS_LOWER={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};/***用于建立十六进制字符的输出的大写字符数组*/privatestaticfinalchar[]DIGITS_UPPER={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};/***将字节数组转换为十六进制字符数组**@paramdata*byte[]*@return十六进制char[]*/publicstaticchar[]encodeHex(byte[]data){returnencodeHex(data,true);}/***将字节数组转换为十六进制字符数组**@paramdata*byte[]*@paramtoLowerCase*<code>true</code>传换成小写格式,<code>false</code>传换成大写格式*@return十六进制char[]*/publicstaticchar[]encodeHex(byte[]data,booleantoLowerCase){returnencodeHex(data,toLowerCase?DIGITS_LOWER:DIGITS_UPPER);}/***将字节数组转换为十六进制字符数组**@paramdata*byte[]*@paramtoDigits*用于控制输出的char[]*@return十六进制char[]*/protectedstaticchar[]encodeHex(byte[]data,char[]toDigits){intl=data.length;char[]out=newchar[l<<1];//twocharactersformthehexvalue.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*/publicstaticStringencodeHexStr(byte[]data){returnencodeHexStr(data,true);}/***将字节数组转换为十六进制字符串**@paramdata*byte[]*@paramtoLowerCase*<code>true</code>传换成小写格式,<code>false</code>传换成大写格式*@return十六进制String*/publicstaticStringencodeHexStr(byte[]data,booleantoLowerCase){returnencodeHexStr(data,toLowerCase?DIGITS_LOWER:DIGITS_UPPER);}/***将字节数组转换为十六进制字符串**@paramdata*byte[]*@paramtoDigits*用于控制输出的char[]*@return十六进制String*/protectedstaticStringencodeHexStr(byte[]data,char[]toDigits){returnnewString(encodeHex(data,toDigits));}/***将十六进制字符数组转换为字节数组**@paramdata*十六进制char[]*@returnbyte[]*@throwsRuntimeException*如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常*/publicstaticbyte[]decodeHex(char[]data){intlen=data.length;if((len&0x01)!=0){thrownewRuntimeException("Oddnumberofcharacters.");}byte[]out=newbyte[len>>1];//twocharactersformthehexvalue.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不是一个合法的十六进制字符时,抛出运行时异常*/protectedstaticinttoDigit(charch,intindex){intdigit=Character.digit(ch,16);if(digit==-1){thrownewRuntimeException("Illegalhexadecimalcharacter"+ch+"atindex"+index);}returndigit;}publicstaticvoidmain(String[]args){StringsrcStr="待转换字符串";StringencodeStr=encodeHexStr(srcStr.getBytes());StringdecodeStr=newString(decodeHex(encodeStr.toCharArray()));System.out.println("转换前:"+srcStr);System.out.println("转换后:"+encodeStr);System.out.println("还原后:"+decodeStr);}}
/blog/aub-1129228
参考mons.codec.binary.Hex
下载地址:/codec/download_codec.cgi