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. spring和mybatis的整合开发(基于MapperFactoryBean的整合开发(方便简单不复杂))

    MapperFactoryBean是mybati-spring团队提供的一个用于根据mapper接口生成mapper对象的类. 在spring配置文件中可以配置以下参数: 1.mapperInterf ...

  2. mysl 常用函数 union all if ifnull exists case when

    1.union all UNION 操作符用于合并两个或多个 SELECT 语句的结果集.请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 S ...

  3. CF1139C Edgy Trees

    题目地址:CF1139C Edgy Trees 红黑树 \(ans\) 应该等于总数(\(n^k\))减去不含黑色边的序列数量 不含黑色边就意味着一个序列只能在一个红色联通块中 一个红色联通块中的序列 ...

  4. Windows server 2012配置WebDeploy发布网站

    以前都是使用win2008r2服务器,最近更新了操作系统到WINDOWS 2012,发现以前的做法已经不适用了. win2008r2配置WebDeploy: https://www.cnblogs.c ...

  5. docker镜像的使用及相关

    参考网站docker中文网:http://www.docker.org.cn/book/docker/docker-push-image-13.html 1.搜索容器: docker search t ...

  6. Java_Number(装箱和拆箱)

    所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number子类 装箱: 自动将基本数据类型装换为包装器类型 拆箱: 自动将包装器类型转换为基本数据类 ...

  7. java---- XMLEncoder 和 XMLDecoder 和 xSteam工具使用

    XMLEncoder: 将对象写入XML数据中 import org.dom4j.DocumentException; import java.beans.XMLEncoder; import jav ...

  8. select2 下拉搜索控件

    1.添加相应的script链接 jquery: <script type="text/javascript" src="http://cdn.bootcss.com ...

  9. vmware ubuntu硬盘空间不够用,空间扩展

    我从来没有想过我的虚拟机内存会不够用,毕竟已经20G了,可是最近学习python,装了些学习有关的软件, 期末做libvirt管理实验,存了两个镜像,就变成这样了,所以,我就像了要扩展硬盘空间,在网上 ...

  10. Swift - use Array

    //数组声明 var arr0 = Array<Int>() var arr1 = Array<String>(count: 3, repeatedValue: "& ...