20170531 课堂实践 MyOD

MyOD

题目

编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能

Linux下od功能详解

od(octal dump)命令可以以八进制、十进制、十六进制和ASCII码来显示文件或者流,它们对于访问或可视地检查文件中不能直接显示在终端上的字符

  • 使用:od [-A 地址进制] [-t 显示格式] 文件
  • 进制
    • o 八进制(系统默认值)
    • d 十进制
    • x 十六进制
    • n 不打印位移值
  • 格式
    • c ASCII字符或反斜杠序列(如\n)
    • d 有符号十进制数
    • f 浮点数
    • o 八进制(系统默认值)
    • u 无符号十进制数
    • x 十六进制数
  • e.g.
radish608@kali:~$ cat abc
123abc
a
s
d
radish608@kali:~$ od -tc -tx abc
0000000 1 2 3 a b c \n a \n s \n d \n
61333231 610a6362 640a730a 0000000a
0000015

Java实现OD功能

/**
* Created by radish608 on 17-5-31.
*/ import java.io.*; class IO {
public static void dump(InputStream src) throws IOException {
try (InputStream input = src) {
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.printf(" \\");
System.out.printf("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(" \\");
System.out.printf("n ");
} else {
System.out.printf(" %c ", data[j]);
}
}
break;
}
}
System.out.printf("\n%07o\n", i+3 );
}
} } public class MyOD {
public static void main(String[] args) throws IOException {
IO.dump(new FileInputStream(args[0]));
}
}
  • 范例文件内容
123abc12345
a
s
d12adfadfa
  • 运行结果

    20170531 课堂实践 MyOD
上一篇:《Java程序设计》第15周课堂实践总结


下一篇:2017-2018-1 20155318 《信息安全系统设计基础》第2周课堂实践、makefile、以及myod