//****************************************************************** // Released under the DevelopMentor OpenSource Software License. // Please consult the LICENSE.jawin file in the project root directory, // or at http://www.develop.com for details before using this // software. //****************************************************************** // From the JAWIN source distribution. package isi.pasco2.util; /** * Helper class for doing hex dumps of arrays to String. Useful for * debugging, esp. on IDEs that are not hex-friendly. */ public class HexFormatter { public static String convertBytesToString(byte[] bytes) { return convertBytesToString(bytes, 16, 0, true); } public static String convertBytesToString( byte[] bytes, int lineLength, int level, boolean showChars) { if (bytes == null) { return "(null array)"; } return convertBytesToString( bytes, 0, bytes.length, lineLength, level, showChars); } public static String convertBytesToString( byte[] bytes, int startOffset, int endOffset, int lineLength, int level, boolean showChars) { if (bytes == null) { return "(null array)"; } int loop = 0; //each byte creates 3-4 chars in the string, so the *5 makes a //buffer that is large enough StringBuffer strb = new StringBuffer(bytes.length * 5); int boundary = (startOffset + lineLength - 1) % lineLength; int charLoop = 0; for (charLoop = loop = startOffset; loop < endOffset; loop++) { if ((loop % lineLength) == 0) { for (int j = 0; j < level + 1; j++) { strb.append("\t"); } } strb.append(getHexString(bytes[loop])); if ((loop % lineLength) == boundary) { if (showChars) { strb.append(' '); while (charLoop <= loop) { strb.append(printChars[bytes[charLoop] & 0x00ff]); charLoop++; } } strb.append("\r\n"); } } // Added this code to print chars of last line. if (showChars && (charLoop < loop)) { for (int gap = loop % lineLength; gap < lineLength; ++gap) { strb.append(" "); } strb.append(' '); while (charLoop < loop) { strb.append(printChars[bytes[charLoop] & 0x00ff]); charLoop++; } } return strb.toString(); } public static String convertBytesToProxyTypeString( byte[] bytes, int startOffset, int endOffset, int lineLength, boolean showChars) { if (bytes == null) { return "(null array)"; } int loop = 0; //each byte creates 3-4 chars in the string, so the *5 makes a //buffer that is large enough StringBuffer strb = new StringBuffer(bytes.length * 5); int boundary = (startOffset + lineLength - 1) % lineLength; int charLoop = 0; for (charLoop = loop = startOffset; loop < endOffset; loop++) { if (loop == 2) { strb.append("-"); } strb.append(getHexProxyTypeString(bytes[loop])); /*if ((loop % lineLength) == boundary) { if (showChars) { strb.append(' '); while (charLoop <= loop) { strb.append(printChars[bytes[charLoop] & 0x00ff]); charLoop++; } } strb.append("\r\n"); }*/ } // Added this code to print chars of last line. /*if ( showChars && ( charLoop < loop ) ) { for ( int gap = loop%lineLength; gap < lineLength; ++gap ) { strb.append(" "); } strb.append(' '); while ( charLoop < loop ) { strb.append( printChars[bytes[charLoop] & 0x00ff] ); charLoop++; } }*/ return strb.toString(); } public final static char[] hexchars = new char[16]; public final static char[] printChars = new char[256]; static { for (char n = 0; n < 10; n++) hexchars[n] = (char) ('0' + n); for (char n = 10; n < 16; n++) hexchars[n] = (char) ('A' - 10 + n); for (char n = 0; n < 32; n++) printChars[n] = '.'; for (char n = 32; n < 256; n++) printChars[n] = (char) n; //for (char n=128; n<256; n++) // printChars[n] = '.'; } public static char[] getHexString(byte b) { char[] result = new char[3]; result[0] = hexchars[(b & 0x00f0) >> 4]; result[1] = hexchars[b & 0x000f]; result[2] = ' '; return result; } public static char[] getHexProxyTypeString(byte b) { char[] result = new char[2]; result[0] = hexchars[(b & 0x00f0) >> 4]; result[1] = hexchars[b & 0x000f]; // result[2] = ' '; return result; } }