• 20179209课后作业之od命令重写


    一.问题描述:

    1 复习c文件处理内容

    2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能

    3. main与其他分开,制作静态库和动态库

    4. 编写Makefile

    二.分析:

    1.实质就是od命令的重写再加动态库和静态库的制作。

    2.一提到命令重写,我能想到的就是带参数的main函数,然后就是详细了解od -tx -tc XXX这条命令实现的功能。

    三.实验环境

    4.3.0-kali1-amd64

    四.详细过程

    1.od -tx -tc XXX命令功能分析


    上面这个图非常值得认真看一下,两条命令od -tc -tx testfileod -tc -tx1 testfile的不同。man od之后得到这样的结论,-x后面不加数字默认一次输出两个字节的十六进制,相当于-x2。然而这里却一次输出了四个字节,而且是倒序!(对比-x1可知)为此我特地去实验楼环境查看,结果一样!但当我运行od -tc -tx2 testfileod -tc -tx4 testfile时出现了这样的情况:
    综上,我得出一个问题:到底是linux关于od命令的注释错了还是linux中一个字母占的不是一个字节?

    2.分析完od -tx -tc XXX命令的功能得出的结论:XXX内容的ascii字符输出一次,以及每四个字符的十六进制倒序输出一次,每行十六个字符。OK!现在开始设计源代码。

    //t头文件
    #ifndef HEAD_H
    #define HEAD_H
    #include <stdlib.h>
    #include <stdio.h>
    FILE *fp;
    char ch;
    char a[16];
    int num_A;
    void GetChar();
    void PrintHex(char ch);
    void PrintAscii(char ch);
    #endif
    

    头文件中有一些全局变量以及函数声明

    //单独定义的全局变量
    #ifndef GLOBE_H
    #define GLOBE_H
    
    int num;
    char temp[4];
    int k;
    #endif
    

    这里单独定义某些全局变量是因为如果把它们写进head.h会出现变量多重定义的错误。具体原因看下面代码就可明白。

    //从文件中读取16个字符写进固定长度和数组
    #include "head.h"
    #include "globe.h"
    void GetChar(){
            while(!feof(fp) && (num < 16)){
                    a[num++] = fgetc(fp);
            }
            num = 0;
    }
    

    为什么要把数据写进数组?是因为-tc和-tx实际上要对数据输出两次,一次单独拿出来16个字符输出纯粹为了方便!

    //以十六进制形式输出a数组中暂存的16个字符
    #include "globe.h"
    #include "head.h"
    void PrintHex(char ch){
            if(k > 0){
                    k--;
                    temp[k] = ch;
            }
            else{
                    for(;k < 4;k++)
                            printf("%x",temp[k]);
                    printf("    ");
                    num_A--;
            }
    }
    //以ascii输出字符
    #include "head.h"
    void PrintAscii(char ch){
            printf("%c  ",ch);
    }
    //makefile
    myod:main.o PrintHex.o PrintAscii.o GetChar.o
            gcc -g *.o -o myod
    
    main.o:main.c head.h
            gcc -c main.c
    PrintHex.o:PrintHex.c globe.h head.h
            gcc -c PrintHex.c
    PrintAscii.o:PrintAscii.c head.h
            gcc -c PrintAscii.c
    GetChar.o:GetChar.c globe.h head.h
            gcc -c GetChar.c
    

    五.结果分析



    没错,程序是有bug的。其实我调试了很长时间都没有找到问题!不明白为什么只有第一行输出格式不正确。由于时间原因,我只能带着问题输出实验结果,如果大家发现问题所在,望告知!同时,我自己也会调试。

    六.总结

    很长时间没有写代码,的确手生了很多,再加上在linux环境下也比较陌生,所以整整花了一下午时间才到达这种程度。其实这个程序还有很多改进的地方,比如修复bug;前面加上行数;命令选项扩展等。日后有时间我会把这些内容重新改进。

  • 相关阅读:
    How to run Java main class and pass application arguments in Maven?
    【转】三年后再反思我的" Java Web项目管理得失谈"
    Object.keys()
    angular $resource 的 get请求 和 post请求
    vue 自定义 移动端筛选条件
    获取当前时间 YYYY-MM-DD
    vue-router 二级路由
    blob 对象 实现分片上传 及 显示进度条
    js性能优化之函数节流(分流函数)
    vue + vue-lazyload 实现图片懒加载
  • 原文地址:https://www.cnblogs.com/genius-sen/p/7673909.html
Copyright © 2020-2023  润新知