Java HexString

byte[]和十六进制字符串相互转换

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示。

所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果

new String(H) + new String(L)

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

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

Java代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package  test;
  
public  class  Hex {
  
     /**
      * 用于建立十六进制字符的输出的小写字符数组
      */
     private  static  final  char [] DIGITS_LOWER = { '0' '1' '2' '3' '4' '5' ,
             '6' '7' '8' '9' 'a' 'b' 'c' 'd' 'e' 'f' };
  
     /**
      * 用于建立十六进制字符的输出的大写字符数组
      */
     private  static  final  char [] DIGITS_UPPER = { '0' '1' '2' '3' '4' '5' ,
             '6' '7' '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' };
  
     /**
      * 将字节数组转换为十六进制字符数组
      *
      * @param data byte[]
      * @return 十六进制char[]
      */
     public  static  char [] encodeHex( byte [] data) {
         return  encodeHex(data,  true );
     }
  
     /**
      * 将字节数组转换为十六进制字符数组
      *
      * @param data        byte[]
      * @param toLowerCase <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
      * @return 十六进制char[]
      */
     public  static  char [] encodeHex( byte [] data,  boolean  toLowerCase) {
         return  encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
     }
  
     /**
      * 将字节数组转换为十六进制字符数组
      *
      * @param data     byte[]
      * @param toDigits 用于控制输出的char[]
      * @return 十六进制char[]
      */
     protected  static  char [] encodeHex( byte [] data,  char [] toDigits) {
         int  l = data.length;
         char [] out =  new  char [l <<  1 ];
         // two characters form the hex value.
         for  ( int  i =  0 , j =  0 ; i < l; i++) {
             out[j++] = toDigits[( 0xF0  & data[i]) >>>  4 ];
             out[j++] = toDigits[ 0x0F  & data[i]];
         }
         return  out;
     }
  
     /**
      * 将字节数组转换为十六进制字符串
      *
      * @param data byte[]
      * @return 十六进制String
      */
     public  static  String encodeHexStr( byte [] data) {
         return  encodeHexStr(data,  true );
     }
  
     /**
      * 将字节数组转换为十六进制字符串
      *
      * @param data        byte[]
      * @param toLowerCase <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
      * @return 十六进制String
      */
     public  static  String encodeHexStr( byte [] data,  boolean  toLowerCase) {
         return  encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
     }
  
     /**
      * 将字节数组转换为十六进制字符串
      *
      * @param data     byte[]
      * @param toDigits 用于控制输出的char[]
      * @return 十六进制String
      */
     protected  static  String encodeHexStr( byte [] data,  char [] toDigits) {
         return  new  String(encodeHex(data, toDigits));
     }
  
     /**
      * 将十六进制字符数组转换为字节数组
      *
      * @param data 十六进制char[]
      * @return byte[]
      * @throws RuntimeException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常
      */
     public  static  byte [] decodeHex( char [] data) {
  
         int  len = data.length;
  
         if  ((len &  0x01 ) !=  0 ) {
             throw  new  RuntimeException( "Odd number of characters." );
         }
  
         byte [] out =  new  byte [len >>  1 ];
  
         // two characters form the hex value.
         for  ( int  i =  0 , j =  0 ; j < len; i++) {
             int  f = toDigit(data[j], j) <<  4 ;
             j++;
             f = f | toDigit(data[j], j);
             j++;
             out[i] = ( byte ) (f &  0xFF );
         }
  
         return  out;
     }
  
     /**
      * 将十六进制字符转换成一个整数
      *
      * @param ch    十六进制char
      * @param index 十六进制字符在字符数组中的位置
      * @return 一个整数
      * @throws RuntimeException 当ch不是一个合法的十六进制字符时,抛出运行时异常
      */
     protected  static  int  toDigit( char  ch,  int  index) {
         int  digit = Character.digit(ch,  16 );
         if  (digit == - 1 ) {
             throw  new  RuntimeException( "Illegal hexadecimal character "  + ch
                     " at index "  + index);
         }
         return  digit;
     }
  
     public  static  void  main(String[] args) {
         String srcStr =  "qwer" ;
         String encodeStr = encodeHexStr(srcStr.getBytes());
         String decodeStr =  new  String(decodeHex(encodeStr.toCharArray()));
         System.out.println( "before encode:"  + srcStr);
         System.out.println( "after encode:"  + encodeStr);
         System.out.println( "convert:"  + decodeStr);
     }
  
}

 

还可以使用common codec来编解码hex string,如下代码片段,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
public  void  test() {
     String hello =  "asdfasdf你还要asdfasdfasdfasdfl" ;
     try  {
         String hexString = Hex.encodeHexString(hello.getBytes( "utf-8" ));
         String hexString2 = Hex.encodeHexString(hello.getBytes( "ascii" ));
         String hexString3 = Hex.encodeHexString(hello.getBytes( "gbk" ));
         String hexString4 =  new  String(Hex.encodeHex(hello.getBytes( "utf-8" ),  false ));
         System.out.println(hexString);
         System.out.println(hexString2);
         System.out.println(hexString3);
         System.out.println(hexString4);
     catch  (UnsupportedEncodingException e) {
         e.printStackTrace();
     }
}

==================END==================

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值