zoukankan      html  css  js  c++  java
  • 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中
    

    代码和结果

    • 运行截图

    代码链接

  • 相关阅读:
    算法训练 接水问题
    算法训练 数组排序去重
    算法训练 A+B Problem
    算法训练 采油区域
    算法训练 会议中心
    JS高级
    JS基础操作
    JavaScript入门(基础)
    表格与表单
    音频与视频
  • 原文地址:https://www.cnblogs.com/besti20155228/p/6926472.html
Copyright © 2011-2022 走看看