一、概念
16进制:与10进制一样,到16时需要进一位,表示方法:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f。java中使用0x开头表示16进制。
byte:java中基础类型,占用1个字节,每个字节8位,取值范围位-128到127。
二、转换思路
16进制在计算机中需要4个字节展示,如15,计算机中二进制表示为1111,(8+4+2+1)。
而byte在计算机中需要8个字节展示,如15,计算机中二进制表示 0000 1111;
所以转换一个byte为16进制,需要两个16进制来表示。如byte的15,16进制表示为0f。
如果为负数怎么办?
需要先了解负数的表示方法,在计算机负数表示方法为负数的绝对值,取反后+1。
如-15,先看绝对值15,表示为0000 1111,然后取反1111 0000,再加1,计算机中表示为1111 0001,两个16进制表示为,f1。
三、设计程序
第一步:定义16进制字符串数据
String[] hexChars = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
第二步:获取byte不同占位的数值
获取前四位 b>>>4 往右移动4位,如-15数字,1111 0001,右移4位,0000 1111,就可以获取到前四位。(>>表示有符号右移,>>>无符号右移,高位自动填充0)
获取后四位 b & 0x0F 与运算,如-15数字,1111 0001,与0x0F,0000 1111,同为1才能为1,所以得到结果,0000 0001,这样就得到后四位。
但是java程序中,默认数字都是int类型,所以byte的>>>或者&都会先将byte转化为int再进行操作。
那么我们可以再改一下
获取byte的前4位,先转化位int(8字节,32位),-15表示为 1111 1111 1111 1111 1111 1111 1111 0001,右移4位肯定不行了,那么我们先把前24位去掉,再右移4就OK了。
(b & 0x000000FF )>>4即可,可以简写位(b & 0xFF )>>4
获取byte的后四位
b&0x0000000F,简写为b&0xF
第三步,获取对应的16进制字符串
直接将两步结果带入数组索引,组合返回就是16进制字符串了。即:hexChars[byte前四位数字]+hexChars[byte后四位数字]
代码
private final static String[] hexChars = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
public static String byteToHexString(byte b){
int d1 = (b & 0xFF)>>4;
int d2 = b & 0x0F;
return hexChars[d1]+hexChars[d2];
}
第四步 字符串转化byte
先将16进制字符串拆分为char,然后不同字符对应不同数字
‘0’,‘1’,‘2’,‘3’,'4','5','6','7','8','9','a','b','c','d','e','f'
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
设计程序
public static int hexCharToInt(char ch) throws Exception {
int b = 0;
switch (ch) {
case '0':
b = 0;
break;
case '1':
b = 1;
break;
case '2':
b = 2;
break;
case '3':
b = 3;
break;
case '4':
b = 4;
break;
case '5':
b = 5;
break;
case '6':
b = 6;
break;
case '7':
b = 7;
break;
case '8':
b = 8;
break;
case '9':
b = 9;
break;
case 'a':
b = 10;
break;
case 'b':
b = 11;
break;
case 'c':
b = 12;
break;
case 'd':
b = 13;
break;
case 'e':
b = 14;
break;
case 'f':
b = 15;
break;
default:
throw new Exception("this char is not hex char");
}
return b ;
}
public static int hexStringToInt(String hexString) throws Exception {
char[] chars = hexString.toCharArray();
int b1 = hexCharToInt(chars[0]);
int b2 = hexCharToInt(chars[1]);
b1 = (b1<<28)>>24;
return b1+b2;
}
好了,这是自己实现的byte与16进制相互转换。
为了快捷,我们也可以使用Integer自带的
Integer.toHexString(i)转换为16进制。
Integer.parseInt(s, radix)16进制转换为int。
如byte转化,10转化为16进制,可以直接使用
String hexString = Integer.toHexString(10 & 0xFF);
if(hexString.length()<2) {
hexString = "0"+hexString;
}
16进制转byte,可以使用如下代码。
(byte)Integer.parseInt("0a", 16);