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