MyOD

一、设计思路

确定MyOD的要求

根据需求可知MyOD需要实现类似Linux下

od -tx -tc XXX的功能,于是先去网上查找了一下od命令的-tx以及-tc参数的作用,经查找后了解到命令参数的功能如下。

  • 最左侧用7位8进制数显示当前字节的数目,从0000000开始,每输出16个字节或字节序列结束时输出一次该7位数字。
  • 将从文件中读入的字节转化为二位十六进制数并按特定的顺序分为四个一组进行输出,当一组中数目不足时不足的部分用0补上。
  • 在十六进制数的下一行输出字节的ASCII值。

(一)将命令行中的参数传入MyOD

使用args[]数组将命令行中输入的文件名参数记录下来,在本程序中文件名存放在args[2]中。

(二)定义输入输出流,对文件进行操作

在MyOD中我使用了字节输入输出流。在创建字节输入输出流对象后通过使用read(byte b[])方法将文件中的字节读入到字节数组input中,并返回读入的字节长度到变量length中。输入输出流一定要在try-catch语句中运行,字节流也需要在使用之后关闭流。

(三)将读入的字节数据转化为二位十六进制数

在这里我使用了for循环语句,并使用变量length控制次数,且在这一过程中将不足二位的十六进制数转化为十六进制数。进制转化的过程中我使用了Integer类的toHexString(byte b)方法减少了转化的难度。相关代码如下

 for (i = 0; i < length; i++) {
temp = Integer.toHexString(input[i]);//转化为二位十六进制数
if (temp.length() != 2) {//如果不足二位
temp = "0" + temp;
if (temp.length() != 2) {
temp = "0" + temp;
}
}
numsix[i] = temp;
}

(三)将读入的数据分为有需要加0的组和不需要加0的组,依此来设置十六进制数输出的实际长度

由于这两种情况的区别仅仅是实际输出的长度,于是我将后续的输出语句写在了output()方法中

(三)输出每行的当前字符数以及按组输出二位十六进制数以及字节相应的ASCII值

我将这些功能都放入了output方法中,需要注意的是每组输出的数据的顺序与本来的顺序相反,读入的换行符也需要输出。由于该部分内容较多,我把相关思路写在代码注释中了。

public static void output(byte[] input,String[] numsix,int length,int temlength){//读入的字节放在input中,numsix中放转换后的二位十六进制数,length为读入字节数,temlength为实际输出的二位十六进制数的个数
int i, j, k;
String[] str = new String[temlength];//存放temlength长度的实际输出的二位十六进制数
for (i = 0; i < length; i++) {
str[i] = numsix[i];
}
for (i = length; i < temlength; i++) {
str[i] = "00";
}
for (i = 0; i < temlength; i++) {//输出7位当前字节数目,从`0000000`开始,每输出16个字节或字节序列结束时输出一次该7位数字。 if (0 == (i % 16) || (temlength - 1) == i) {
if ((temlength - 1) == i) {
System.out.printf("\n%07o", length);
} else if (0 == i) {
System.out.printf("\n%07o", 0);
} else if (0 == i % 16) {
System.out.printf("\n%07o", i);
} else {
System.out.println(i);
System.out.printf("\n%07o", i + 1);
}
}
if (0 == i % 4) {//每组要按反序输出
System.out.print("\t");
for (j = i + 3; j >= i; j--) {
System.out.print(str[j]);
}
}
if (i < length) {//每行有16个字节或到最后一个字节时换行,并输出上一行数据对应的ASCII if (0 == ((i + 1) % 16) || (temlength - 1) == (i + 1)) {
System.out.println();
System.out.print("\t");
if (0 == ((i + 1) % 16)) {
for (k = i - 15; k <= i; k++) {
if ((char) input[k] == '\n') {//当ASCII值是换行符时另外输出
System.out.print("\\n");
} else {
System.out.printf("%c", (char) input[k]);//转化为ASCII
}
System.out.print(" ");
}
} else if ((temlength - 1) == (i + 1)) {
for (k = i - (length % 16)+2 ; k <= i+1; k++) {
if ((char) input[k] == '\n') {
System.out.print("\\n");
} else {
System.out.printf("%c", (char) input[k]);
}
System.out.print(" ");
}
}
} }
}
}

二、测试代码

由于需要使用命令行传入参数,因此没有使用junit对代码进行测试,运行结果及遇到的相关问题请见后面部分。

三、运行结果

四、码云代码

链接

五、遇到的问题

该程序较为困难的地方在于如何控制分组并在合适的地方进行换行输出,在实现这一过程中遇到了许多问题,我就没有逐个例举了。

  • 问题1:输出的7位数字不符合预期,更改变量后仍不正确。
  • 问题1解决方法:后面想到该7位数字是八进制的,需要对个数进行进制的转换。
  • 问题2:在对数据进行格式转换时出现java.lang.NumberFormatException 错误。
  • 问题2解决方法:找到相应的进行转化的代码,发现是读入了空格,于是使用trim()方法去除两端的空格,该错误的详细解决方法请见参考资料。
  • 问题3:输出的ASCII值自动换行。
  • 问题3解决方法:输出了换行符,对换行符进行另外的输出。

六、感想与思考

本次选做需要实现的MyOD类还是比较困难的,需要解决的问题很多,尤其是在控制分组并在合适的地方进行换行输出,并在换行后如何输出ASCII值,由于这次不太方便使用IDEA,没法进行调试,这给编程的过程造成了比较大的困难,但这也使我能对命令行中返回的错误有所了解。

七、参考资料

MyOD-Linux od命令的实现的更多相关文章

  1. linux od命令详解

    Linux od命令 Linux od命令用于输出文件内容.od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来 将指定文件以八进制形式(默认)转储到标准输出.如果指定了多于一个的文件参数 ...

  2. linux od命令

    用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进制和ASCII码来显示文件.od命令系统默认的显示方式是八进制,这也是该命令的名称由来(Octal Du ...

  3. Linux od命令(以指定进制显示文件)

    从“读取二进制文件”出发,到od命令的使用 在桃村实习期间,一直努力做毕业设计,我的毕业设计中有一个内容就是读取SEGY文件.在读取文件时,经常遇到的问题时你要读取浮点型数据,这时你就必须考虑你所使用 ...

  4. linux od命令: 按不同进制显示文件

    介绍:od(octal dump)命令可以以八进制.十进制.十六进制和ASCII码来显示文件或者流,它们对于访问或可视地检查文件中不能直接显示在终端上的字符很有用.语法: od [-A 地址进制] [ ...

  5. binary hacks读数笔记(od命令)

    Linux od命令用于输出文件内容. od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来 -t<输出格式>或--format=<输出格式> 设置输出格式. 实例 ...

  6. [转]Linux之od命令

    转自:http://os.51cto.com/art/200912/173136.htm 随着计算机飞速的发展,很多人开始学习Linux,怎样才能学好Linux,一定要学好Linux的命令.学习Lin ...

  7. linux下hexdump和od命令:显示文件十六进制格式

    Linux指令: od 示例用法:  od -c hello Linux指令:      od od命令用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进 ...

  8. 以二进制的形式查看文件 Linux之od命令详解

    od命令 以二进制的形式查看文件 od -t x1 /usr/local/FT/config/hsm_create.utf8.sql ef bb bf 4c 5f 0d 0a 5f 4e 4e 4f ...

  9. (转)linux下od命令的使用

    linux下od命令的使用 原文:http://blog.csdn.net/shylock_backer/article/details/46473283 名称:od作用:格式化输出文件中的数据提要: ...

  10. linux之od命令

    od [OPTION]... [FILE]...  把文件用8进制或者其他的格式显示出来.通常用于查看特殊格式文件的内容.  这个命令默认把文件的内容用八进制的形式清晰地写在标准输出上.如果是多个文件 ...

随机推荐

  1. react-router v4中 HashRouter 和 BrowserRouter的使用

    遇到的问题 项目中控制路由跳转使用的是BrowserRouter,代码如下: ReactDOM.render(( <BrowserRouter> <div className=&qu ...

  2. 题解 P4692 【[Ynoi2016]谁的梦】

    Ynoi 中少见的不卡常题呢....虽说有 50 个数据点... 果然还是道好题 noteskey 总之就是补集转化的思想,算出每种颜色选点的总方案减去不可行方案(就是不包含 该种颜色的点的区间选取方 ...

  3. Laravel 生成migration ,boolean字段字段转为tinyInteger

    Schema::create('consults', function (Blueprint $table) { $table->increments('id'); $table->str ...

  4. MySQL基础使用

    数据库 其实我们常常说的数据库,应该叫数据库系统. 表和库 数据表:用来保存数据的表格 数据库:用来统一管理数据表的容器 启动mysql 关闭mysql service mysqld start(启动 ...

  5. Set集合(scala)

    特点 Set集合最大的特点是:无序 不可重复 定长Set集合 无序 scala> val set = Set(1,5,4,3,7) set: scala.collection.immutable ...

  6. 2018年发表论文阅读:Convolutional Simplex Projection Network for Weakly Supervised Semantic Segmentation

    记笔记目的:刻意地.有意地整理其思路,综合对比,以求借鉴.他山之石,可以攻玉. <Convolutional Simplex Projection Network for Weakly Supe ...

  7. day19模块1

    http://www.cnblogs.com/Eva-J/articles/7228075.html#_label10 collections模块: 在内置数据类型(dict.list.set.tup ...

  8. DO、DTO和VO分层设计的好处

      2016年10月23日 20:11:03 阅读数:10646 在Java中 VO. PO.DO.DTO. BO. QO.DAO.POJO的概念中介绍过Java中的各种模型概念.在这里简单再总结一下 ...

  9. Ubuntu18.04安装Python虚拟环境

    仅为使用Ubuntu18.04的Python开发人员作参考 1.安装Ubuntu18.04虚拟环境 sudo apt install virtualenv sudo apt install virtu ...

  10. Mongodb字段自增长

    MongoClient client = new MongoClient("mongodb://xxx.xxx.x.xx:27017"); var mongServer = cli ...