Home | History | Annotate | Download | only in misc
      1 /*
      2  * Copyright (c) 1995, 1997, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25 
     26 
     27 package sun.misc;
     28 import java.io.PrintStream;
     29 import java.io.OutputStream;
     30 import java.io.IOException;
     31 
     32 /**
     33  * This class encodes a buffer into the classic: "Hexadecimal Dump" format of
     34  * the past. It is useful for analyzing the contents of binary buffers.
     35  * The format produced is as follows:
     36  * <pre>
     37  * xxxx: 00 11 22 33 44 55 66 77   88 99 aa bb cc dd ee ff ................
     38  * </pre>
     39  * Where xxxx is the offset into the buffer in 16 byte chunks, followed
     40  * by ascii coded hexadecimal bytes followed by the ASCII representation of
     41  * the bytes or '.' if they are not valid bytes.
     42  *
     43  * @author      Chuck McManis
     44  */
     45 
     46 public class HexDumpEncoder extends CharacterEncoder {
     47 
     48     private int offset;
     49     private int thisLineLength;
     50     private int currentByte;
     51     private byte thisLine[] = new byte[16];
     52 
     53     static void hexDigit(PrintStream p, byte x) {
     54         char c;
     55 
     56         c = (char) ((x >> 4) & 0xf);
     57         if (c > 9)
     58             c = (char) ((c-10) + 'A');
     59         else
     60             c = (char)(c + '0');
     61         p.write(c);
     62         c = (char) (x & 0xf);
     63         if (c > 9)
     64             c = (char)((c-10) + 'A');
     65         else
     66             c = (char)(c + '0');
     67         p.write(c);
     68     }
     69 
     70     protected int bytesPerAtom() {
     71         return (1);
     72     }
     73 
     74     protected int bytesPerLine() {
     75         return (16);
     76     }
     77 
     78     protected void encodeBufferPrefix(OutputStream o) throws IOException {
     79         offset = 0;
     80         super.encodeBufferPrefix(o);
     81     }
     82 
     83     protected void encodeLinePrefix(OutputStream o, int len) throws IOException {
     84         hexDigit(pStream, (byte)((offset >>> 8) & 0xff));
     85         hexDigit(pStream, (byte)(offset & 0xff));
     86         pStream.print(": ");
     87         currentByte = 0;
     88         thisLineLength = len;
     89     }
     90 
     91     protected void encodeAtom(OutputStream o, byte buf[], int off, int len) throws IOException {
     92         thisLine[currentByte] = buf[off];
     93         hexDigit(pStream, buf[off]);
     94         pStream.print(" ");
     95         currentByte++;
     96         if (currentByte == 8)
     97             pStream.print("  ");
     98     }
     99 
    100     protected void encodeLineSuffix(OutputStream o) throws IOException {
    101         if (thisLineLength < 16) {
    102             for (int i = thisLineLength; i < 16; i++) {
    103                 pStream.print("   ");
    104                 if (i == 7)
    105                     pStream.print("  ");
    106             }
    107         }
    108         pStream.print(" ");
    109         for (int i = 0; i < thisLineLength; i++) {
    110             if ((thisLine[i] < ' ') || (thisLine[i] > 'z')) {
    111                 pStream.print(".");
    112             } else {
    113                 pStream.write(thisLine[i]);
    114             }
    115         }
    116         pStream.println();
    117         offset += thisLineLength;
    118     }
    119 
    120 }
    121