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. Pytorch中的自动求导函数backward()所需参数含义

    摘要:一个神经网络有N个样本,经过这个网络把N个样本分为M类,那么此时backward参数的维度应该是[N X M] 正常来说backward()函数是要传入参数的,一直没弄明白backward需要传 ...

  2. 请求超时VUE axios重新再次请求

    //在main.js设置全局的请求次数,请求的间隙 axios.defaults.retry = 4; axios.defaults.retryDelay = 1000; axios.intercep ...

  3. java和数据库中日期类型的常见用法

    (1)java中日期类型:Date.Timestamp(2)数据库中:Date.Timestamp(3)字符串和Date之间的格式化转换:    SimpleDateFormat类方法: format ...

  4. poj 2155 matrix 二维线段树 线段树套线段树

    题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...

  5. 解决nginx和php使用ckfinder无法上传大文件的问题

    现象描述:cms内容发布系统上传不了大文件,当上传超过32M文件时就上传不了 提示:无效的文件. 文件尺寸太大. 分析文件上传过程:browser --> nginx --> php 需要 ...

  6. Python基础【第一篇】

     一.Python简介 Python的创始人(Guido von Rossum 荷兰人),Guido希望有一种语言既能像C一样方便地调用操作系统的功能接口,也能像shell脚本一样,轻松地实现编程,A ...

  7. 【原创】大数据基础之Ambari(1)简介、编译安装、使用

    官方:http://ambari.apache.org/ The Apache Ambari project is aimed at making Hadoop management simpler ...

  8. 解构声明(Destructuring Declarations)

    解构声明的概念和作用 把一个对象成员解构(destructure)成多个变量,称为解构声明(destructuring declaration). component1(),component2()等 ...

  9. python输入

    (程序是如何输入输出的) 先了解一个概念,什么是函数? 简单来说,函数就是封装了一些功能,到时候只需要写一个函数名字,就可以使用这些功能 input函数,它是输入函数,它可以将用户输入的内容当做“字符 ...

  10. laravel 服务容器

    服务容器,也叫IOC容器,其实包含了依赖注入(DI)和控制反转(IOC)两部分,是laravel的真正核心.其他的各种功能模块比如 Route(路由).Eloquent ORM(数据库 ORM 组件) ...