在Java中字符串由字符char组成, 一个char由两个byte组成, 而一个byte由八个bit组成, 一个十六进制字符(0-F)实际上由4个字节byte即可表达, 因此, 从字节数组到十六进制字符串, 实际上占用的存储空间扩大了4倍。

 

下面来看一下从十六进制字符串转换为字节数组的方式:

第一种方法: 实际借用了Character类的方法进行16进制的转换

 1         static byte[] hexToByteArray2(String hex)
 2     {
 3         int l = hex.length();
 4         byte[] data = new byte[l / 2];
 5         for (int i = 0; i < l; i += 2)
 6         {
 7             data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
 8                     + Character.digit(hex.charAt(i + 1), 16));
 9         }
10         return data;
11     }

 

第二种方法: 借用了Integer类中的十六进制转换:

1     static byte[] hexToByteArray(String hexString) {
2         byte[] result = new byte[hexString.length() / 2];
3         for (int len = hexString.length(), index = 0; index <= len - 1; index += 2) {
4             String subString = hexString.substring(index, index + 2);
5             int intValue = Integer.parseInt(subString, 16);
6             result[index / 2] = (byte)intValue;
7         }
8         return result;
9     }

 

 

从字节数组转换为十六进制的方法:

一、

 1     static String byteArrayToHex(byte[] bytes) {
 2         StringBuilder result = new StringBuilder();
 3         for (int index = 0, len = bytes.length; index <= len - 1; index += 1) {
 4             int char1 = ((bytes[index] >> 4) & 0xF);
 5             char chara1 = Character.forDigit(char1, 16);
 6             int char2 = ((bytes[index]) & 0xF);
 7             char chara2 = Character.forDigit(char2, 16);
 8             result.append(chara1);
 9             result.append(chara2);
10         }
11         return result.toString();
12     }

 

二、

 1     static String byteArrayToHex2(byte[] bytes) {
 2         StringBuilder result = new StringBuilder();
 3         for (int index = 0, len = bytes.length; index <= len - 1; index += 1) {
 4 
 5             String invalue1 = Integer.toHexString((bytes[index] >> 4) & 0xF);
 6             String intValue2 = Integer.toHexString(bytes[index] & 0xF);
 7             result.append(invalue1);
 8             result.append(intValue2);
 9         }
10         return result.toString();
11     }

 

然后介绍一种更实用的字符串和十六进制之间的转换:

十六进制转字符串:

1     static String hexToString(String hex, Charset charset) {
2         return new String(new BigInteger(hex, 16).toByteArray(), charset);
3     }

 

字符串转十六进制:

1     static String stringToHex(String arg, Charset charset) {
2         if (arg == null || arg.length() == 0) {
3             return "";
4         }
5         byte[] bytes = arg.getBytes(charset);
6         return String.format("%0" + bytes.length * 2 + "x", new BigInteger(1, bytes));
7     }

 

 

 

 

posted on 2019-11-18 00:12  浮舟z  阅读(10583)  评论(0编辑  收藏  举报