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);
}
}