服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java实现的进制转换工具类完整示例

Java实现的进制转换工具类完整示例

2021-05-13 11:37黄宝康 Java教程

这篇文章主要介绍了Java实现的进制转换工具类,结合完整实例形式分析了Java实现二进制、十六进制、字符串、数组等相关转换操作技巧,需要的朋友可以参考下

本文实例讲述了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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
import java.nio.charset.charset;
/**
 * 十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制,一般用数字0到9和字母a到f表示(其中:a~f即10~15)。<br>
 * 例如十进制数57,在二进制写作111001,在16进制写作39。<br>
 * 像java,c这样的语言为了区分十六进制和十进制数值,会在十六进制数的前面加上 0x,比如0x20是十进制的32,而不是十进制的20<br>
 *
 * 参考:https://my.oschina.net/xinxingegeya/blog/287476
 *
 * @author looly
 *
 */
public class hexkit {
  /**
   * 用于建立十六进制字符的输出的小写字符数组
   */
  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' };
  //---------------------------------------------------------------------------------------------------- encode
  /**
   * 将字节数组转换为十六进制字符数组
   *
   * @param data byte[]
   * @return 十六进制char[]
   */
  public static char[] encodehex(byte[] data) {
    return encodehex(data, true);
  }
  /**
   * 将字节数组转换为十六进制字符数组
   *
   * @param str 字符串
   * @param charset 编码
   * @return 十六进制char[]
   */
  public static char[] encodehex(string str, charset charset) {
    return encodehex(strkit.getbytes(str, charset), 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[]
   * @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);
  }
  //---------------------------------------------------------------------------------------------------- decode
  /**
   * 将十六进制字符数组转换为字符串
   *
   * @param hexstr 十六进制string
   * @param charset 编码
   * @return 字符串
   */
  public static string decodehexstr(string hexstr, charset charset) {
    if(strkit.isempty(hexstr)){
      return hexstr;
    }
    return decodehexstr(hexstr.tochararray(), charset);
  }
  /**
   * 将十六进制字符数组转换为字符串
   *
   * @param hexdata 十六进制char[]
   * @param charset 编码
   * @return 字符串
   */
  public static string decodehexstr(char[] hexdata, charset charset) {
    return strkit.str(decodehex(hexdata), charset);
  }
  /**
   * 将十六进制字符数组转换为字节数组
   *
   * @param hexdata 十六进制char[]
   * @return byte[]
   * @throws runtimeexception 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常
   */
  public static byte[] decodehex(char[] hexdata) {
    int len = hexdata.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(hexdata[j], j) << 4;
      j++;
      f = f | todigit(hexdata[j], j);
      j++;
      out[i] = (byte) (f & 0xff);
    }
    return out;
  }
  //---------------------------------------------------------------------------------------- private method start
  /**
   * 将字节数组转换为十六进制字符串
   *
   * @param data byte[]
   * @param todigits 用于控制输出的char[]
   * @return 十六进制string
   */
  private static string encodehexstr(byte[] data, char[] todigits) {
    return new string(encodehex(data, todigits));
  }
  /**
   * 将字节数组转换为十六进制字符数组
   *
   * @param data byte[]
   * @param todigits 用于控制输出的char[]
   * @return 十六进制char[]
   */
  private 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 ch 十六进制char
   * @param index 十六进制字符在字符数组中的位置
   * @return 一个整数
   * @throws runtimeexception 当ch不是一个合法的十六进制字符时,抛出运行时异常
   */
  private 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;
  }
  //---------------------------------------------------------------------------------------- private method end
  /**
   * 2进制转16进制
   * @param bstring 2进制字符串
   * @return
   */
  public static string binary2hex(string bstring) {
    if (bstring == null || bstring.equals("") || bstring.length() % 8 != 0)
      return null;
    stringbuffer tmp = new stringbuffer();
    int itmp = 0;
    for (int i = 0; i < bstring.length(); i += 4) {
      itmp = 0;
      for (int j = 0; j < 4; j++) {
        itmp += integer.parseint(bstring.substring(i + j, i + j + 1)) << (4 - j - 1);
      }
      tmp.append(integer.tohexstring(itmp));
    }
    return tmp.tostring();
  }
  /**
   * 16进制转2进制
   * @param hexstring
   * @return
   */
  public static string hex2binary(string hexstring) {
    if (hexstring == null || hexstring.length() % 2 != 0)
      return null;
    string bstring = "", tmp;
    for (int i = 0; i < hexstring.length(); i++) {
      tmp = "0000" + integer.tobinarystring(integer.parseint(hexstring.substring(i, i + 1), 16));
      bstring += tmp.substring(tmp.length() - 4);
    }
    return bstring;
  }
  /**
   * 将二进制转换成16进制
   * @param buf
   * @return
   */
  public static string binary2hex(byte buf[]) {
    stringbuffer sb = new stringbuffer();
    for (int i = 0; i < buf.length; i++) {
      string hex = integer.tohexstring(buf[i] & 0xff);
      if (hex.length() == 1) {
        hex = '0' + hex;
      }
      sb.append(hex.touppercase());
    }
    return sb.tostring();
  }
  /**
   * 将16进制转换为二进制
   * @param hexstr
   * @return
   */
  public static byte[] hex2byte(string hexstr) {
    if (hexstr.length() < 1)
      return null;
    byte[] result = new byte[hexstr.length() / 2];
    for (int i = 0; i < hexstr.length() / 2; i++) {
      int high = integer.parseint(hexstr.substring(i * 2, i * 2 + 1), 16);
      int low = integer.parseint(hexstr.substring(i * 2 + 1, i * 2 + 2), 16);
      result[i] = (byte) (high * 16 + low);
    }
    return result;
  }
}

希望本文所述对大家java程序设计有所帮助。

原文链接:https://blog.csdn.net/huangbaokang/article/details/75034021

延伸 · 阅读

精彩推荐