Save This Page
Home » openjdk-7 » sun » misc » [javadoc | source]
    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   }

Save This Page
Home » openjdk-7 » sun » misc » [javadoc | source]