-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathHexFun.java
More file actions
255 lines (222 loc) · 6.09 KB
/
Copy pathHexFun.java
File metadata and controls
255 lines (222 loc) · 6.09 KB
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
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
package io.github.xfuns.java.fun;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
* HexFun Hex 库
*
* @author smallmenu
*/
public class HexFun {
/**
* DEFAULT_CHARSET
*/
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
/**
* Hex Code
*/
private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
/**
* Hex Code
*/
private static final char[] DIGITS_UPPER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
/**
* charset
*/
private final Charset charset;
/**
* Construct
*/
public HexFun() {
charset = DEFAULT_CHARSET;
}
/**
* Construct
*
* @param charset Charset
*/
public HexFun(final Charset charset) {
this.charset = charset;
}
/**
* Get charset
*
* @return Charset
*/
public Charset getCharset() {
return this.charset;
}
/**
* Get charset
*
* @return String
*/
public String getCharsetName() {
return this.charset.name();
}
/**
* Construct
*
* @param charsetName 字符集
*/
public HexFun(final String charsetName) {
this(Charset.forName(charsetName));
}
/**
* toDigit
*
* @param ch char
* @param index int
* @return int
* @throws Exception e
*/
protected static int toDigit(final char ch, final int index) throws Exception {
final int digit = Character.digit(ch, 16);
if (digit == -1) {
throw new Exception("Illegal hexadecimal character " + ch + " at index " + index);
}
return digit;
}
/**
* decodeHex
*
* @param data 字节数组
* @return byte[]
* @throws Exception e
*/
public static byte[] decodeHex(final char[] data) throws Exception {
final byte[] out = new byte[data.length >> 1];
decodeHex(data, out, 0);
return out;
}
/**
* decodeHex
*
* @param data 字节数组
* @param out byte[]
* @param outOffset int
* @return int
* @throws Exception e
*/
public static int decodeHex(final char[] data, final byte[] out, final int outOffset) throws Exception {
final int len = data.length;
if ((len & 0x01) != 0) {
throw new Exception("Odd number of characters.");
}
final int outLen = len >> 1;
if (out.length - outOffset < outLen) {
throw new Exception("Output array is not large enough to accommodate decoded data.");
}
for (int i = outOffset, 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 outLen;
}
/**
* decodeHex
*
* @param data 字节数组
* @return byte[]
* @throws Exception e
*/
public static byte[] decodeHex(final String data) throws Exception {
return decodeHex(data.toCharArray());
}
/**
* encodeHexString
*
* @param data 字节数组
* @return String
*/
public static String encodeHexString(final byte[] data) {
return new String(encodeHex(data));
}
/**
* encodeHexString
*
* @param data 字节数组
* @param toLowerCase boolean
* @return String
*/
public static String encodeHexString(final byte[] data, final boolean toLowerCase) {
return new String(encodeHex(data, toLowerCase));
}
/**
* encodeHex
*
* @param data 字节数组
* @return char[]
*/
public static char[] encodeHex(final byte[] data) {
return encodeHex(data, true);
}
/**
* encodeHex
*
* @param data 字节数组
* @param toLowerCase 大小写
* @return char[]
*/
public static char[] encodeHex(final byte[] data, final boolean toLowerCase) {
return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
}
/**
* encodeHex
*
* @param data 字节数组
* @param toDigits char[]
* @return char[]
*/
protected static char[] encodeHex(final byte[] data, final char[] toDigits) {
final int l = data.length;
final char[] out = new char[l << 1];
encodeHex(data, 0, data.length, toDigits, out, 0);
return out;
}
/**
* encodeHex
*
* @param data 字节数组
* @param dataOffset int
* @param dataLen int
* @param toLowerCase boolean
* @return char[]
*/
public static char[] encodeHex(final byte[] data, final int dataOffset, final int dataLen, final boolean toLowerCase) {
final char[] out = new char[dataLen << 1];
encodeHex(data, dataOffset, dataLen, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER, out, 0);
return out;
}
/**
* encodeHex
*
* @param data 字节数组
* @param dataOffset int
* @param dataLen int
* @param toLowerCase boolean
* @param out char[]
* @param outOffset int
*/
public static void encodeHex(final byte[] data, final int dataOffset, final int dataLen, final boolean toLowerCase, final char[] out, final int outOffset) {
encodeHex(data, dataOffset, dataLen, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER, out, outOffset);
}
/**
* encodeHex
*
* @param data 字节数组
* @param dataOffset int
* @param dataLen int
* @param toDigits char[]
* @param out char[]
* @param outOffset int
*/
private static void encodeHex(final byte[] data, final int dataOffset, final int dataLen, final char[] toDigits, final char[] out, final int outOffset) {
for (int i = dataOffset, j = outOffset; i < dataOffset + dataLen; i++) {
out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
out[j++] = toDigits[0x0F & data[i]];
}
}
}