Javabyte[]数组和十六进制String之间的转换

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)。即byte用十六进制表示只占2位。

同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上。

根据以上原理,我们就可以将byte[] 数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte[]数组了


下面是实现byte[]数组和十六进制字符串之间转化的工具类:


[java] view plaincopy
  1. package text.com;  
  2.   
  3. public class BytesUtil {  
  4.     /** 
  5.     * Convert byte[] to hex string. 把字节数组转化为字符串 
  6.     * 这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。 
  7.     * @param src byte[] data 
  8.     * @return hex string 
  9.     */     
  10.    public static String bytesToHexString(byte[] src){  
  11.        StringBuilder stringBuilder = new StringBuilder("");  
  12.        if (src == null || src.length <= 0) {  
  13.            return null;  
  14.        }  
  15.        for (int i = 0; i < src.length; i++) {  
  16.            int v = src[i] & 0xFF;  
  17.            String hv = Integer.toHexString(v);  
  18.            if (hv.length() < 2) {  
  19.                stringBuilder.append(0);  
  20.            }  
  21.            stringBuilder.append(hv+" ");  
  22.        }  
  23.        return stringBuilder.toString();  
  24.    }  
  25.    /** 
  26.     * Convert hex string to byte[]   把为字符串转化为字节数组 
  27.     * @param hexString the hex string 
  28.     * @return byte[] 
  29.     */  
  30.    public static byte[] hexStringToBytes(String hexString) {  
  31.        if (hexString == null || hexString.equals("")) {  
  32.            return null;  
  33.        }  
  34.        hexString = hexString.toUpperCase();  
  35.        int length = hexString.length() / 2;  
  36.        char[] hexChars = hexString.toCharArray();  
  37.        byte[] d = new byte[length];  
  38.        for (int i = 0; i < length; i++) {  
  39.            int pos = i * 2;  
  40.            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));  
  41.        }  
  42.        return d;  
  43.    }  
  44.    /** 
  45.     * Convert char to byte     
  46.     * @param c char 
  47.     * @return byte  
  48.     */  
  49.     private static byte charToByte(char c) {  
  50.        return (byte"0123456789ABCDEF".indexOf(c);  
  51.    }  
  52. }  
下面是测试程序:
[java] view plaincopy
  1. package text.com;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         byte b1 = 11;  
  6.         byte b2 = 21;  
  7.         byte b3 = 31;  
  8.         byte b4 = 41;  
  9.         byte b5 = 51;  
  10.         byte b6 = 61;  
  11.         byte b7 = 71;  
  12.         byte b8 = 81;  
  13.         byte[] bytes = new byte[] { b1, b2, b3, b4, b5, b6, b7, b8 };  
  14.         String hexString = "0b 15 1f 29 33 3d 47 51";  
  15.         String str = BytesUtil.bytesToHexString(bytes);  
  16.         System.out.println("str--->" + str);  
  17.         byte[] hexStringToBytes = BytesUtil.hexStringToBytes(hexString);  
  18.         for (int i = 0; i < hexStringToBytes.length; i++) {  
  19.             System.out.println("hexStringToBytes---->" + hexStringToBytes[i]);  
  20.         }  
  21.     }  
  22.   
  23. }  

控制台输出:

str--->0b 15 1f 29 33 3d 47 51 
hexStringToBytes---->11
hexStringToBytes---->21
hexStringToBytes---->31
hexStringToBytes---->41
hexStringToBytes---->51
hexStringToBytes---->61
hexStringToBytes---->71
hexStringToBytes---->81

上一篇:Netty源码阅读入门实战(八) - 解码下(下)


下一篇:VMWare Workstation 11的安装