Java将字节转换为十六进制代码分享
本文部分代码摘录自网上,并稍加整理,用于字节与十六进制之间的转换。
/** *referenceapachecommons<a *href="http://commons.apache.org/codec/">http://commons.apache.org/codec/</a> * *byte占用8位,十六进制字符占用4位。所以可以把一个byte转换成两个相应的十六进制字符,即把byte的高4位和低4位*分别转换成相应的十六进制字符H和L,并组合起来。相反的转换也是同理。 * */ 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'}; /** *将字节数组转换为十六进制字符数组。 * *因为使用两个字符表示一个字节,所以返回的char[]长度将是参数byte[]长度的两倍。 * *@paramdata *用于转换为十六进制字符的byte[] *@return包含十六进制字符的char[] */ publicstaticchar[]encodeHex(finalbyte[]data){ returnencodeHex(data,true); } /** *将字节数组转换为十六进制字符数组。 * *因为使用两个字符表示一个字节,所以返回的char[]长度将是参数byte[]长度的两倍。 * *@paramdata *用于转换为十六进制字符的byte[] *@paramtoLowerCase *<code>true</code>传换成小写格式,<code>false</code>传换成大写格式 *@return包含十六进制字符的char[] */ publicstaticchar[]encodeHex(finalbyte[]data,finalbooleantoLowerCase){ returnencodeHex(data,toLowerCase?DIGITS_LOWER:DIGITS_UPPER); } /** *将字节数组转换为十六进制字符数组。 * *因为使用两个字符表示一个字节,所以返回的char[]长度将是参数byte[]长度的两倍。 * *@paramdata *用于转换为十六进制字符的byte[] *@paramtoDigits *用于控制输出的字母表 *@return包含十六进制字符的char[] */ protectedstaticchar[]encodeHex(finalbyte[]data,finalchar[]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; } /** *将字节数组转换为十六进制字符串。 * *因为使用两个字符表示一个字节,所以返回的的字符串长度将是参数byte[]长度的两倍。 * *@paramdata *用于转换为十六进制字符的byte[] *@return十六进制字符串 */ publicstaticStringencodeHexStr(finalbyte[]data){ returnencodeHexStr(data,true); } /** *将字节数组转换为十六进制字符串。 * *因为使用两个字符表示一个字节,所以返回的的字符串长度将是参数byte[]长度的两倍。 * *@paramdata *用于转换为十六进制字符的byte[] *@paramtoLowerCase *<code>true</code>传换成小写格式,<code>false</code>传换成大写格式 *@return十六进制字符串 */ publicstaticStringencodeHexStr(byte[]data,booleantoLowerCase){ returnencodeHexStr(data,toLowerCase?DIGITS_LOWER:DIGITS_UPPER); } /** *将字节数组转换为十六进制字符串。 * *因为使用两个字符表示一个字节,所以返回的的字符串长度将是参数byte[]长度的两倍。 * *@paramdata *用于转换为十六进制字符的byte[] *@paramtoDigits *用于控制输出的字母表 *@return十六进制字符串 */ 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对应两个十六进制字符,则将byte[]大小设置为char[]大小的一半 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 *要转换成整数的字符 *@paramindex *字符在字符数组中的位置 *@return一个整数 *@throwsRuntimeException *当ch不是一个合法的十六进制字符时,抛出该异常 */ protectedstaticinttoDigit(finalcharch,finalintindex){ finalintdigit=Character.digit(ch,16); if(digit==-1){ thrownewRuntimeException("Illegalhexadecimalcharacter"+ch+"atindex"+index); } returndigit; } publicstaticvoidmain(String[]args){ StringsrcStr="HelloWorld!"; StringencodeStr=encodeHexStr(srcStr.getBytes(),false); StringdecodeStr=newString(decodeHex(encodeStr.toCharArray())); System.out.println("源字符串:"+srcStr); System.out.println("字符串编码为十六进制:"+encodeStr); System.out.println("十六进制解码为字符串:"+decodeStr); } }