MyOD-Linux od命令的实现
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命令的实现的更多相关文章
- linux od命令详解
Linux od命令 Linux od命令用于输出文件内容.od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来 将指定文件以八进制形式(默认)转储到标准输出.如果指定了多于一个的文件参数 ...
- linux od命令
用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进制和ASCII码来显示文件.od命令系统默认的显示方式是八进制,这也是该命令的名称由来(Octal Du ...
- Linux od命令(以指定进制显示文件)
从“读取二进制文件”出发,到od命令的使用 在桃村实习期间,一直努力做毕业设计,我的毕业设计中有一个内容就是读取SEGY文件.在读取文件时,经常遇到的问题时你要读取浮点型数据,这时你就必须考虑你所使用 ...
- linux od命令: 按不同进制显示文件
介绍:od(octal dump)命令可以以八进制.十进制.十六进制和ASCII码来显示文件或者流,它们对于访问或可视地检查文件中不能直接显示在终端上的字符很有用.语法: od [-A 地址进制] [ ...
- binary hacks读数笔记(od命令)
Linux od命令用于输出文件内容. od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来 -t<输出格式>或--format=<输出格式> 设置输出格式. 实例 ...
- [转]Linux之od命令
转自:http://os.51cto.com/art/200912/173136.htm 随着计算机飞速的发展,很多人开始学习Linux,怎样才能学好Linux,一定要学好Linux的命令.学习Lin ...
- linux下hexdump和od命令:显示文件十六进制格式
Linux指令: od 示例用法: od -c hello Linux指令: od od命令用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进 ...
- 以二进制的形式查看文件 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 ...
- (转)linux下od命令的使用
linux下od命令的使用 原文:http://blog.csdn.net/shylock_backer/article/details/46473283 名称:od作用:格式化输出文件中的数据提要: ...
- linux之od命令
od [OPTION]... [FILE]... 把文件用8进制或者其他的格式显示出来.通常用于查看特殊格式文件的内容. 这个命令默认把文件的内容用八进制的形式清晰地写在标准输出上.如果是多个文件 ...
随机推荐
- cvc-complex-type.2.4.a: Invalid content was found starting with element 'asy
- CSS选择器权重计算
CSS各种选择器的权重: 1.ID选择器 +100 2.类.属性.伪类选择器 +10 3.元素.伪元素选择器 +1 4.其他选择器 +0 如果有两个CSS样式都作用于某元素,如: #id ...
- Emacs Org-mode 4 超连接
4.1 连接格式 连接的格式非常的简单,示例如下: [[文档内部锚点.外部连接][对连接的描述,可选]] 4.2 内部连接 想要引用或者连接到文档自身内的某个位置,需要引入另外一个概念:anchor( ...
- Python学习笔记七
面向对象编程 面向对象的特性如下: 类:具有相同属性和方法的一类事物,成为类. 对象:类的实例化后的结果,一个类可以实例化多个对象,每个对象也可以不同的属性. 封装:在类中对数据的赋值,类里面包含着类 ...
- 蒙特卡诺近似与PBM
介绍蒙特卡诺近似的例子代码 #include<fstream> #include<iostream> #include<cstdlib> #include<c ...
- 一篇图看清Java中的各种Queue
说到数据结构,我们大概可以列出这么几个:数组,链表,栈,队列,集合,哈希表. 其中 队列 作为一个常用的数据结构,在Java中也有各种形式的实现. 顶级接口为java.util.queue. java ...
- github使用的小坑 处理
1.本地版本 低于线上版本,并做了修改 ,线上版本也做了修改的情况下,提交内容,必须解决冲突 会出现 解决方法 冲突的几个文件 进行初始还原 在进行 更新 与线上同步,在将需要提交的/新增/修改的内容 ...
- Linux系统挂载Windows系统下的共享文件
声明:本文是小编借鉴大神们的经验,仅供学习使用. 第一步:在Windows系统上选择要共享的文件夹,右击“属性”-“共享”-“高级共享”-勾选“共享此文件”-设置共享名-“权限”-“添加”-“高级”- ...
- LeetCode问题
1.Two Sum """Given an array of integers, return indices of the two numbers such that ...
- hdu5701-中位数计数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5701 题目: Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个 ...