MyOD 代码实现
MyOD的代码实现
一、题目要求:
编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能
二、设计思路
OD命令详解:
因此,该题目所要实现的功能为以十六进制输出文本内容,同时输出对应的ASCII码值。
三、程序代码
import java.io.*;
public class MyOD{
public static void main(String[] args){
String filename=args[0];
File file= new File(filename);
try {
FileInputStream input = new FileInputStream(file);
byte[] data = new byte[1024];
int i, flag;
input.read(data);
for (i = 0; i < 1024; i = i + 4) {
if (i % 16 == 0) {
System.out.printf("\n%07o\t\t", i );
}
System.out.printf(" %02x%02x%02x%02x\t", data[i + 3], data[i + 2], data[i + 1], data[i]);
if ((i + 4) % 16 == 0) {
System.out.println();
System.out.printf("\t ");
for (int j = i - 12; j < i+4 ; j++) {
if ((int) data[j] == 10) {
System.out.print("\\n");
} else {
System.out.printf(" %c ", data[j]);
}
}
}
if (data[i+4] ==0 ) {
System.out.println();
System.out.printf("\t ");
for (int j = i-i%16; data[j-3] != 0; j++) {
if ((int) data[j] == 10) {
System.out.printf("\\n");
} else {
System.out.printf(" %c ", data[j]);
}
}
break;
}
}
System.out.printf("\n%07o\n", i+3 );
}
catch (IOException e){
System.out.println("Error:"+e);
}
}
}
程序要点分析
printf("%02x",data[i])
是一个类似C语言的表达方式。%02x代表输出该数字的十六进制,不满两位的第一位补0;- 输出结果中每四个字符对应的十六进制串是次序反过来的,例如单词
This
,T(54),h(68),i(69),s(73)。输出时则会输出73696854。 - 四个字节为一组,判断开头通过i对16取余判断是否为0实现。
运行截图
总结
必须诚实地讲,这次的代码并非我独立编写。由于抽时间跑了一个密码学计算方法的超长待机的程序,我给自己留下做这个任务的时间并不很多。况且使用mac系统并没有安装linux虚拟机,也没有办法实地操作使用od命令,只能尽可能的查找资料艰涩的理解。此次程序我更多的参考了往届学长学姐的博客。娄老师说如果代码不是自己写的理解透了也是好的。在对学长学姐代码的研究中,我运用了一些小窍门。对代码进行一块一块的分块,如循环体等可以做为小块来独立出去,将这部分代码删去,看看运行结果少了或者偏了哪些,那这部分代码就是用来干什么的,带着这段代码实现的目的去分析,就可以很轻松的理解代码含义。理解了之后发现这个任务并不算难,实现这个功能尚且有其他方法,如果时间足够还可以抽时间重写一次。