import java.io.*;
import java.util.*;

class HEXTOOLS {

    static final int C_DEF_MAXDUMPLINES = 20;

    private static int maxdumplines = C_DEF_MAXDUMPLINES;

    static {
	maxdumplines = C_DEF_MAXDUMPLINES;
	System.out.println("HEXTOOLS initialized");
    }

  public static String tohexdig(int n) {
    int i = n&0x0F;
    switch (i) {
    case 0: return "0";
    case 1: return "1";
    case 2: return "2";
    case 3: return "3";
    case 4: return "4";
    case 5: return "5";
    case 6: return "6";
    case 7: return "7";
    case 8: return "8";
    case 9: return "9";
    case 10: return "A";
    case 11: return "B";
    case 12: return "C";
    case 13: return "D";
    case 14: return "E";
    case 15: return "F";
    }
    return "*";
  }

   public static String tohex2(int i) {
   return HEXTOOLS.tohexdig(i>>>4)+HEXTOOLS.tohexdig(i);
  }

   public static String tohex4(int i) {
   return HEXTOOLS.tohex2(i>>>8)+HEXTOOLS.tohex2(i&0xFF);
  }

   public static String tohex8(int i) {
   return HEXTOOLS.tohex4(i>>>16)+HEXTOOLS.tohex4(i&0xFFFF);
  }
  public static String tohexstring(byte s[], int len) {
    int i=0;
    StringBuffer t = new StringBuffer();
    while (i<len)
      t.append(tohex2(s[i++]));
    return t.toString();
  }

   public static String todec2(int i) {
   return HEXTOOLS.tohexdig(i/10)+HEXTOOLS.tohexdig(i % 10);
  }

  public static void dump(byte s[], int len, PrintStream ps, String pfx) {
    int i,j,k,l;
    i = 0;
    l = 0;
    if (len==0) { ps.println(pfx+" < no data >"); } 
    while (i<len) {
      ps.print(pfx+" "+HEXTOOLS.tohex4(i)+": ");
      if (l<=maxdumplines) {
      	for (j=0;j<16;j++) {
      	  k = i+j;
      	  if (k<len) {
      	    ps.print(HEXTOOLS.tohex2(s[k])+" "); }
      	  else { ps.print("   "); }
      	}
      	for (j=0;j<16;j++) {
      	  k = i+j;
      	  if (k<len) {
      		    if ((s[k]>=32) && (s[k]<127)) {
      			ps.print((char)(s[k]));
      		    }
      		    else
      			ps.print(".");
      		}
      	  else { ps.print(" ");
      		}
      	}
      	i+=16;
      	ps.println();
	l++;
      }
      else {
	  ps.println(" ... <truncated> ...");
	  i = len+1;
      } 
    }
  }

  public static void dump(byte s[], int len, String pfx) {
      dump(s,len,System.out,pfx);
  }

  public static void dump(byte s[], int len, PrintStream ps) {
      dump(s,len,ps,"");
  }

  public static void dump(byte s[], int len) {
      dump(s,len,System.out,"");
  }

}
