public class ByteUtil { public static String getRawData(byte[] v) { StringBuffer leftSide = new StringBuffer(); StringBuffer rightSide = new StringBuffer(); StringBuffer bothSides = new StringBuffer(); for( int i = 0 ; i < v.length ; ++i ) { // Check for breaks. if( (i != 0) ) { if( (i % 2) == 0 ) { leftSide.append(' '); } if( (i % 16) == 0 ) { addToBothSides(bothSides, leftSide, rightSide, true); } } leftSide.append(byteToHexString(v[i])); if( v[i] < 32 || v[i] > 176 ) { rightSide.append('.'); } else { rightSide.append((char)v[i]); } } if( leftSide.length() > 0 ) { addToBothSides(bothSides, leftSide, rightSide, false); } return bothSides.toString(); } private static void addToBothSides(StringBuffer bothSides, StringBuffer leftSide, StringBuffer rightSide, boolean eol) { bothSides.append(new Pad(leftSide.toString(), 40, Pad.LEFT)); bothSides.append(" "); bothSides.append(rightSide.toString()); // I don't want the last line to have an EOL character. if( eol ) { bothSides.append('\n'); } // Clear StringBuffers for next round. leftSide.delete(0, leftSide.length()); rightSide.delete(0, rightSide.length()); } private static String byteToHexString(byte b) { // You need to output '0' as "00" and '1' as "01" etc. Also, // Integer.toHexString() prints out lots of 'f' characters // when the byte is sign extended when cast to an int. char[] rv = new char[2]; rv[1] = hexDigitToChar( (byte)(b & 0x0f) ); b >>= 4; rv[0] = hexDigitToChar( (byte)(b & 0x0f) ); return new String(rv); } private static char hexDigitToChar(byte b) { if( b < 0 || b > 0x0f ) { throw new IllegalArgumentException("out of range " + b); } char rv = '\0'; switch( b ) { case 0x0: rv = '0'; break; case 0x1: rv = '1'; break; case 0x2: rv = '2'; break; case 0x3: rv = '3'; break; case 0x4: rv = '4'; break; case 0x5: rv = '5'; break; case 0x6: rv = '6'; break; case 0x7: rv = '7'; break; case 0x8: rv = '8'; break; case 0x9: rv = '9'; break; case 0xa: rv = 'a'; break; case 0xb: rv = 'b'; break; case 0xc: rv = 'c'; break; case 0xd: rv = 'd'; break; case 0xe: rv = 'e'; break; case 0xf: rv = 'f'; break; default: break; } return rv; } }