import java.io.*; /* 简介:一个类似于debug的十六进制文件查看工具,左侧显示十六进制数字,右侧显示字符。 用法:java HexReader filename */ public class HexReader { private static final int MAX_BYTE_PER_LINE=16; //每行的数字和字符数 public static void main(String[] args) { if(args.length==0) //若参数为空,则显示用法 { showUsage(); return ; } FileInputStream fstream=null; //文件输入流 try { fstream=new FileInputStream(args[0]); //args[0]是一个文件名 } catch (Exception e) { System.err.println("file not found!"); System.exit(1); } int row=0,col=0,i=0; int[] array=new int[MAX_BYTE_PER_LINE]; try { while(fstream.available()>0) //若文件文件可用 { int num=fstream.read(); //读取一个字节 System.out.println(num); array[i++]=num; //存入数组 String byt=Integer.toHexString(num).toUpperCase(); //将该字节换成大写的十六进制 if(byt.length()==1) //若该字节小于0xF { byt="0"+byt; //高位补0 } System.out.print(byt+" "); //输出该十六进制数字 if((++row)==MAX_BYTE_PER_LINE) //控制每行为16个数字 { row=0; //移到行首 i=0; //移到数组开始位置 col++; //换行 System.out.print(" "); //设置间隔,左面为十六进制数字,右面为字符 for(int j=0;j<MAX_BYTE_PER_LINE;j++) //控制字符也为每行16个 { if(array[j]>=32 && array[j]<=126) //若该字符可打印,则输出 { System.out.print((char)array[j]); } else //若不可打印,则以"."代替 { System.out.print("."); } } System.out.println(); //输出换行 } if(col==8) { //输出8行后,输出一个空行,按任意键后继续显示 } } } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if(fstream!=null) //关闭输入流 { fstream.close(); } } catch (IOException e) { System.err.println("file close failure!"); } } } private static void showUsage() { System.out.println("Usage:java HexReader fileName"); } }