java中进制的转换,Byte与16进制的转换方法
java中对于进制的转换有很多方式,其中对于常见的基本的二进制八进制十进制十六进制等的转换有对于的包装类实现,不需要通过二外的算法来进行实现,具体如下:
首先关于最简单的二进制转换的方法有:
十进制转成十六进制:
StringInteger.toHexString(inti)
十进制转成八进制
StringInteger.toOctalString(inti)
十进制转成二进制
StringInteger.toBinaryString(inti)
十六进制转成十进制
Integer.valueOf("FFFF",16).toString() //不能处理带前缀的情况0x
八进制转成十进制
Integer.valueOf("76",8).toString() //前缀0可以被处理
二进制转十进制
Integer.valueOf("0101",2).toString()
有什么方法可以直接将2,8,16进制直接转换为10进制的吗?
java.lang.Integer类
parseInt(Strings,intradix)
使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
examplesfromjdk:
parseInt("0",10)returns0
parseInt("473",10)returns473
parseInt("-0",10)returns0
parseInt("-FF",16)returns-255
parseInt("1100110",2)returns102
parseInt("2147483647",10)returns2147483647
parseInt("-2147483648",10)returns-2147483648
parseInt("2147483648",10)throwsaNumberFormatException
parseInt("99",throwsaNumberFormatException
parseInt("Kona",10)throwsaNumberFormatException
parseInt("Kona",27)returns411787
进制转换如何写(二,八,十六)不用算法
Integer.toBinaryString
Integer.toOctalString
Integer.toHexString
然后是介绍java中的byte与十六进制数的转换
原理分析:
Java中的byte是由8个bit组成的,而16进制即16中状态,它是由4个bit来表示的,因为24=16。所以我们可以把一个byte转换成两个用16进制字符,即把高4位和低4位转换成相应的16进制字符,并组合这两个16进制字符串,从而得到byte的16进制字符串。同理,相反的转换也是将两个16进制字符转换成一个byte。
在Java中字节与十六进制的相互转换主要思想有两点:
1、二进制字节转十六进制时,将字节高位与0xF0做"&"操作,然后再左移4位,得到字节高位的十六进制A;将字节低位与0x0F做"&"操作,得到低位的十六进制B,将两个十六进制数拼装到一块AB就是该字节的十六进制表示。
2、十六进制转二进制字节时,将十六进制字符对应的十进制数字右移动4为,得到字节高位A;将字节低位的十六进制字符对应的十进制数字B与A做"|"运算,即可得到十六进制的二进制字节表示
其中一种转换的函数如下:
/**
*
*@parambytes
*@return将二进制转换为十六进制字符输出
*/</span>privatestaticStringhexStr="0123456789ABCDEF";//全局
publicstaticStringBinaryToHexString(byte[]bytes){
Stringresult="";
Stringhex="";
for(inti=0;i<bytes.length;i++){
//字节高4位
<strong>hex=String.valueOf(hexStr.charAt((bytes[i]&0xF0)>>4));</strong>
//字节低4位
<strong>hex+=String.valueOf(hexStr.charAt(bytes[i]&0x0F));</strong>
result+=hex;
}
returnresult;
}
/**
*
*@paramhexString
*@return将十六进制转换为字节数组
*/
publicstaticbyte[]HexStringToBinary(StringhexString){
//hexString的长度对2取整,作为bytes的长度
intlen=hexString.length()/2;
byte[]bytes=newbyte[len];
bytehigh=0;//字节高四位
bytelow=0;//字节低四位
for(inti=0;i<len;i++){
//右移四位得到高位
high=(byte)((hexStr.indexOf(hexString.charAt(2*i)))<<4);
low=(byte)hexStr.indexOf(hexString.charAt(2*i+1));
bytes[i]=(byte)(high|low);//高地位做或运算
}
returnbytes;
}
}
还有一种类似的方法:
<spanstyle="font-size:14px;">*Convertbyte[]tohexstring.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。
*@paramsrcbyte[]data
*@returnhexstring
*/
publicstaticStringbytesToHexString(byte[]src){
StringBuilderstringBuilder=newStringBuilder("");
if(src==null||src.length<=0){
returnnull;
}
for(inti=0;i<src.length;i++){
intv=src[i]&0xFF;
Stringhv=Integer.toHexString(v);
if(hv.length()<2){
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
returnstringBuilder.toString();
}
/**
*Converthexstringtobyte[]
*@paramhexStringthehexstring
*@returnbyte[]
*/
publicstaticbyte[]hexStringToBytes(StringhexString){
if(hexString==null||hexString.equals("")){
returnnull;
}
hexString=hexString.toUpperCase();
intlength=hexString.length()/2;
char[]hexChars=hexString.toCharArray();
byte[]d=newbyte[length];
for(inti=0;i<length;i++){
intpos=i*2;
d[i]=(byte)(charToByte(hexChars[pos])<<4|charToByte(hexChars[pos+1]));
}
returnd;
}
/**
*Convertchartobyte
*@paramcchar
*@returnbyte
*/
privatebytecharToByte(charc){
return(byte)"0123456789ABCDEF".indexOf(c);
}</span>
两种方式类似,这里注意下
上面是将byte[]转化十六进制的字符串,注意这里b[i]&0xFF将一个byte和0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[i]&0xFF运算后得出的仍然是个int,那么为何要和0xFF进行与运算呢?直接Integer.toHexString(b[i]);,将byte强转为int不行吗?答案是不行的.
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式
所以与负数&的时候负数会自动给补码补位1,这样就会有误差
而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
还有一些网上总结的方法:
字符串转换成十六进制字符串方法1:
/**
*字符串转换成十六进制字符串
*/
publicstaticStringstr2HexStr(Stringstr){
char[]chars="0123456789ABCDEF".toCharArray();
StringBuildersb=newStringBuilder("");
byte[]bs=str.getBytes();
intbit;
for(inti=0;i<bs.length;i++){
bit=(bs[i]&0x0f0)>>4;
sb.append(chars[bit]);
bit=bs[i]&0x0f;
sb.append(chars[bit]);
}
returnsb.toString();
}
十六进制字符串转换成为数组方法1:
/**
*把16进制字符串转换成字节数组
*@paramhexString
*@returnbyte[]
*/
publicstaticbyte[]hexStringToByte(Stringhex){
intlen=(hex.length()/2);
byte[]result=newbyte[len];
char[]achar=hex.toCharArray();
for(inti=0;i<len;i++){
intpos=i*2;
result[i]=(byte)(toByte(achar[pos])<<4|toByte(achar[pos+1]));
}
returnresult;
}
privatestaticinttoByte(charc){
byteb=(byte)"0123456789ABCDEF".indexOf(c);
returnb;
}
数组转换成十六进制字符串方法1:
/**
*数组转换成十六进制字符串
*@parambyte[]
*@returnHexString
*/
publicstaticfinalStringbytesToHexString(byte[]bArray){
StringBuffersb=newStringBuffer(bArray.length);
StringsTemp;
for(inti=0;i<bArray.length;i++){
sTemp=Integer.toHexString(0xFF&bArray[i]);
if(sTemp.length()<2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
returnsb.toString();
}
byte[]数组转换成十六进制字符串方法2:
/**
*数组转成十六进制字符串
*@parambyte[]
*@returnHexString
*/
publicstaticStringtoHexString1(byte[]b){
StringBufferbuffer=newStringBuffer();
for(inti=0;i<b.length;++i){
buffer.append(toHexString1(b[i]));
}
returnbuffer.toString();
}
publicstaticStringtoHexString1(byteb){
Strings=Integer.toHexString(b&0xFF);
if(s.length()==1){
return"0"+s;
}else{
returns;
}
}
十六进制字符串转换字符串方法1:
/**
*十六进制字符串转换成字符串
*@paramhexString
*@returnString
*/
publicstaticStringhexStr2Str(StringhexStr){
Stringstr="0123456789ABCDEF";
char[]hexs=hexStr.toCharArray();
byte[]bytes=newbyte[hexStr.length()/2];
intn;
for(inti=0;i<bytes.length;i++){
n=str.indexOf(hexs[2*i])*16;
n+=str.indexOf(hexs[2*i+1]);
bytes[i]=(byte)(n&0xff);
}
returnnewString(bytes);
}
十六进制字符串转换字符串方法2:
/**
*十六进制字符串转换字符串
*@paramHexString
*@returnString
*/
publicstaticStringtoStringHex(Strings){
byte[]baKeyword=newbyte[s.length()/2];
for(inti=0;i<baKeyword.length;i++){
try{
baKeyword[i]=(byte)(0xff&Integer.parseInt(s.substring(
i*2,i*2+2),16));
}catch(Exceptione){
e.printStackTrace();
}
}
try{
s=newString(baKeyword,"utf-8");//UTF-16le:Not
}catch(Exceptione1){
e1.printStackTrace();
}
returns;
}
以上这篇java中进制的转换,Byte与16进制的转换方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。