1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.core.buffer;
21
22
23
24
25
26
27 class IoBufferHexDumper {
28
29
30
31
32 private static final byte[] highDigits;
33
34
35
36
37 private static final byte[] lowDigits;
38
39
40
41
42 static {
43 final byte[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
44
45 int i;
46 byte[] high = new byte[256];
47 byte[] low = new byte[256];
48
49 for (i = 0; i < 256; i++) {
50 high[i] = digits[i >>> 4];
51 low[i] = digits[i & 0x0F];
52 }
53
54 highDigits = high;
55 lowDigits = low;
56 }
57
58
59
60
61
62
63
64
65 public static String getHexdump(IoBuffer in, int lengthLimit) {
66 if (lengthLimit == 0) {
67 throw new IllegalArgumentException("lengthLimit: " + lengthLimit + " (expected: 1+)");
68 }
69
70 boolean truncate = in.remaining() > lengthLimit;
71 int size;
72 if (truncate) {
73 size = lengthLimit;
74 } else {
75 size = in.remaining();
76 }
77
78 if (size == 0) {
79 return "empty";
80 }
81
82 StringBuilder out = new StringBuilder(size * 3 + 3);
83
84 int mark = in.position();
85
86
87 int byteValue = in.get() & 0xFF;
88 out.append((char) highDigits[byteValue]);
89 out.append((char) lowDigits[byteValue]);
90 size--;
91
92
93 for (; size > 0; size--) {
94 out.append(' ');
95 byteValue = in.get() & 0xFF;
96 out.append((char) highDigits[byteValue]);
97 out.append((char) lowDigits[byteValue]);
98 }
99
100 in.position(mark);
101
102 if (truncate) {
103 out.append("...");
104 }
105
106 return out.toString();
107 }
108 }