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命令功能分析

20179209课后作业之od命令重写
一.问题描述:
二.分析:
三.实验环境
四.详细过程
五.结果分析
六.总结
上面这个图非常值得认真看一下,两条命令od -tc -tx testfileod -tc -tx1 testfile的不同。man od之后得到这样的结论,-x后面不加数字默认一次输出两个字节的十六进制,相当于-x2。然而这里却一次输出了四个字节,而且是倒序!(对比-x1可知)为此我特地去实验楼环境查看,结果一样!但当我运行od -tc -tx2 testfileod -tc -tx4 testfile时出现了这样的情况:20179209课后作业之od命令重写
一.问题描述:
二.分析:
三.实验环境
四.详细过程
五.结果分析
六.总结
综上,我得出一个问题:到底是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

五.结果分析

20179209课后作业之od命令重写
一.问题描述:
二.分析:
三.实验环境
四.详细过程
五.结果分析
六.总结
20179209课后作业之od命令重写
一.问题描述:
二.分析:
三.实验环境
四.详细过程
五.结果分析
六.总结
没错,程序是有bug的。其实我调试了很长时间都没有找到问题!不明白为什么只有第一行输出格式不正确。由于时间原因,我只能带着问题输出实验结果,如果大家发现问题所在,望告知!同时,我自己也会调试。

六.总结

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