• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
苍穹之下,铁幕之后
博客园    首页    新随笔    联系   管理    订阅  订阅

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

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以字符为单位读入。

  • 将字符转换成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中

代码和结果

  • 运行截图

代码链接

posted @ 2017-06-01 00:00  Besti20155228  阅读(246)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3