博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20155228 2017-5-31 课堂测试:编写MyOD.java
阅读量:4967 次
发布时间:2019-06-12

本文共 2668 字,大约阅读时间需要 8 分钟。

20155228 2017-5-31 课堂测试:编写MyOD.java

题目和要求

编写MyOD.java:用java MyOD XXX实现Linux下od -tx -tc XXX的功能

提交测试代码和运行结果截图,加上学号水印,提交码云代码链接。

分析和设计

import java.io.*;/** * Created by besti20155228 on 17-5-31. */public class code053102 {    public static void main(String[] args) throws IOException {        FileReader reader = new FileReader(args[0]);//新建FileReader实例,将args[0]的内容作为源文件实例        StringWriter writer = new StringWriter();//新建StringWriter实例        code053103.dump(reader, writer);//调用dump方法进行处理    }}class code053103 {    public static void dump(Reader src, Writer dest) throws IOException {        try (Reader input = src; Writer output = dest)//检查地址是否正确 {            char[] data = new char[1024];//定义一个字符数组用来装读取到的内容            int[] number = new int[1024];//定义一个数组用来装读取的内容的ascii码            int length;            int n;            String temp=new String();//定义一个字符串用来装读取到的内容的ascii码的16进制形式数            String string=new String();            while ((length = input.read(data)) != -1)//成功读取到字符 {                output.write(data, 0, length);//将源文件内容放到目的文件中            }            for (n = 0; n < 1024; n++) {                if (data[n] != 0)                {                    System.out.print(data[n]);//打印读取到的字符                    if ((n + 1) % 32 == 0)//每隔16个字符打印一个空格,源文件中的空格也算一个字符,所以是32个                        System.out.println();                }            }            for (n = 0; n < 1024; n++) {                number[n] = (int) data[n];//将读取的字符转换为ascii码                temp=Integer.toHexString(number[n]);//将ascii码换成16进制数                string=string+" "+temp;//把16进制的ascii码放到string中                if (number[n] != 0) {                    if (number[n] != 32 && number[n]!=10)//不打印空格的ascii码,也不打印不到1024位的部分 {                        System.out.print(number[n]);                        System.out.print(" ");                    }                    if ((n + 1) % 32 == 0)//每隔16个字符打印一个空格,源文件中的空格也算一个字符,所以是32个                        System.out.println();                }            }            System.out.println(string);//打印16进制的ascii码        }    }}

问题和解决

  • 本来是想直接教材第十章开头的代码的思路,以byte为单位读入文件内容的。但是后来想起一个字符是2个byte,如果按btye的格式读入的话就把字符的编码给拆开了,所以最后用了FileReader和StringWriter以字符为单位读入。

1073846-20170531235712227-70942054.png

  • 将字符转换成ascii码:通过查阅教材发现FileReader读入字符实际上就是读入ascii码值,所以强制类型转换就可以了
number[n] = (int) data[n];
  • 根据要求每16个字符进行1次换行,但是if语句设为(n + 1) % 16 == 0)的时候发现每隔8个字符就换行了,后来仔细思考想到空格也要算一个字符!所以代码应该改为:
if ((n + 1) % 32 == 0)//每隔16个字符打印一个空格,源文件中的空格也算一个字符,所以是32个        System.out.println();
  • 将10进制ascii码转换成16进制ascii码可以直接调用Integer.toHexString方法:
temp=Integer.toHexString(number[n]);//将ascii码换成16进制数string=string+" "+temp;//把16进制的ascii码放到string中

代码和结果

  • 运行截图

1073846-20170601000333321-248479659.jpg

转载于:https://www.cnblogs.com/besti20155228/p/6926472.html

你可能感兴趣的文章
socket套接字编程
查看>>
Daily Scrum 10.21
查看>>
【知识点】Filter、Servlet、Listener区别与联系
查看>>
keyboard scan code 表
查看>>
How to Build Aggregate/Composite Components in Delphi
查看>>
NT系统下木马进程的隐藏与检测
查看>>
Delphi中文本文件Utf-8和Ansi转换
查看>>
mycat 1.6.6.1 distinct报错问题
查看>>
关于Oracle伪列rownum
查看>>
html知识点
查看>>
交互式报告系统 Dr. Tom | 华大基因培训资料
查看>>
sql日期函数
查看>>
sdk下载地址
查看>>
redis 日志等级说明
查看>>
request.GetResponse 400错误处理方法
查看>>
poj 3083 Children of the Candy Corn (dfs+bfs)
查看>>
模块 DLL C:\Windows\system32\inetsrv\aspnetcore.dll 未能加载。返回的数据为错误信息。(IIS7应用程序池自动关闭)...
查看>>
gd库
查看>>
EasyUI TreeGrid
查看>>
jbpm designer 变量
查看>>