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
  • 运行结果
posted @ 2017-06-01 16:49  0**  阅读(169)  评论(0编辑  收藏  举报