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