一、概念

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