home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / java / util / hexdumpencoder.java < prev    next >
Text File  |  1995-08-11  |  3KB  |  116 lines

  1. /*
  2.  * @(#)HexDumpEncoder.java    1.1 95/04/02 Chuck McManis
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20.  
  21. package java.util;
  22. import java.io.OuputStreamBuffer;
  23. import java.io.PrintStream;
  24. import java.io.OutputStream;
  25.  
  26. /**
  27.  * This class encodes a buffer into the classic: "Hexadecimal Dump" format of
  28.  * the past. It is useful for analyzing the contents of binary buffers.
  29.  * The format produced is as follows:
  30.  * <pre>
  31.  * xxxx: 00 11 22 33 44 55 66 77   88 99 aa bb cc dd ee ff ................
  32.  * </pre>
  33.  * Where xxxx is the offset into the buffer in 16 byte chunks, followed
  34.  * by ascii coded hexadecimal bytes followed by the ASCII representation of
  35.  * the bytes or '.' if they are not valid bytes.
  36.  *
  37.  * @version    1.1, 02 Apr 1995
  38.  * @author    Chuck McManis
  39.  */
  40.  
  41. public class HexDumpEncoder extends CharacterEncoder {
  42.  
  43.     private int offset;
  44.     private int thisLineLength;
  45.     private int currentByte;
  46.     private byte thisLine[] = new byte[16];
  47.  
  48.     static void hexDigit(PrintStream p, byte x) {
  49.     char c;
  50.  
  51.     c = (char) ((x >> 4) & 0xf);
  52.     if (c > 9)
  53.         c = (char) ((c-10) + 'A');
  54.     else
  55.         c = (char)(c + '0');
  56.     p.write(c);
  57.     c = (char) (x & 0xf);
  58.     if (c > 9)
  59.         c = (char)((c-10) + 'A');
  60.     else
  61.         c = (char)(c + '0');
  62.     p.write(c);
  63.     }
  64.  
  65.     int bytesPerAtom() {
  66.     return (1);
  67.     }
  68.  
  69.     int bytesPerLine() {
  70.     return (16);
  71.     }
  72.  
  73.     void encodeBufferPrefix(OutputStream o) {
  74.     offset = 0;
  75.     super.encodeBufferPrefix(o);
  76.     }
  77.  
  78.     void encodeLinePrefix(OutputStream o, int len) {
  79.     hexDigit(pStream, (byte)((offset >>> 8) & 0xff));
  80.     hexDigit(pStream, (byte)(offset & 0xff));
  81.     pStream.print(": ");
  82.     currentByte = 0;
  83.     thisLineLength = len;
  84.     }
  85.     
  86.     void encodeAtom(OutputStream o, byte buf[], int off, int len) {
  87.     thisLine[currentByte] = buf[off];
  88.     hexDigit(pStream, buf[off]);
  89.     pStream.print(" ");
  90.     currentByte++;
  91.     if (currentByte == 8)
  92.         pStream.print("  ");
  93.     }
  94.  
  95.     void encodeLineSuffix(OutputStream o) {
  96.     if (thisLineLength < 16) {
  97.         for (int i = thisLineLength; i < 16; i++) {
  98.         pStream.print("   ");
  99.         if (i == 7)
  100.             pStream.print("  ");
  101.         }
  102.     }
  103.     pStream.print(" ");
  104.     for (int i = 0; i < thisLineLength; i++) {
  105.         if ((thisLine[i] < ' ') || (thisLine[i] > 'z')) {
  106.         pStream.print(".");
  107.         } else {
  108.         pStream.write(thisLine[i]);
  109.             }
  110.     }
  111.     pStream.println();
  112.     offset += thisLineLength;
  113.     }
  114.  
  115. }
  116.