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
/*
 * %W% %E%
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */


package sun.misc;
import java.io.PrintStream;
import java.io.OutputStream;
import java.io.IOException;

/**
 * This class encodes a buffer into the classic: "Hexadecimal Dump" format of
 * the past. It is useful for analyzing the contents of binary buffers.
 * The format produced is as follows:
 * <pre>
 * xxxx: 00 11 22 33 44 55 66 77   88 99 aa bb cc dd ee ff ................
 * </pre>
 * Where xxxx is the offset into the buffer in 16 byte chunks, followed
 * by ascii coded hexadecimal bytes followed by the ASCII representation of
 * the bytes or '.' if they are not valid bytes.
 *
 * @version %I%, %G%
 * @author  Chuck McManis
 */

public class HexDumpEncoder extends CharacterEncoder {

    private int offset;
    private int thisLineLength;
    private int currentByte;
    private byte thisLine[] = new byte[16];

    static void hexDigit(PrintStream p, byte x) {
    char c;

    c = (char) ((x >> 4) & 0xf);
    if (c > 9)
        c = (char) ((c-10) + 'A');
    else
        c = (char)(c + '0');
    p.write(c);
    c = (char) (x & 0xf);
    if (c > 9)
        c = (char)((c-10) + 'A');
    else
        c = (char)(c + '0');
    p.write(c);
    }

    protected int bytesPerAtom() {
    return (1);
    }

    protected int bytesPerLine() {
    return (16);
    }

    protected void encodeBufferPrefix(OutputStream o) throws IOException {
    offset = 0;
    super.encodeBufferPrefix(o);
    }

    protected void encodeLinePrefix(OutputStream o, int len) throws IOException {
    hexDigit(pStream, (byte)((offset >>> 8) & 0xff));
    hexDigit(pStream, (byte)(offset & 0xff));
    pStream.print(": ");
    currentByte = 0;
    thisLineLength = len;
    }
    
    protected void encodeAtom(OutputStream o, byte buf[], int off, int len) throws IOException {
    thisLine[currentByte] = buf[off];
    hexDigit(pStream, buf[off]);
    pStream.print(" ");
    currentByte++;
    if (currentByte == 8)
        pStream.print("  ");
    }

    protected void encodeLineSuffix(OutputStream o) throws IOException {
    if (thisLineLength < 16) {
        for (int i = thisLineLength; i < 16; i++) {
        pStream.print("   ");
        if (i == 7)
            pStream.print("  ");
        }
    }
    pStream.print(" ");
    for (int i = 0; i < thisLineLength; i++) {
        if ((thisLine[i] < ' ') || (thisLine[i] > 'z')) {
        pStream.print(".");
        } else {
        pStream.write(thisLine[i]);
            }
    }
    pStream.println();
    offset += thisLineLength;
    }

}
			
			

Browsed Source: [clear]