20181202 李祎铭 2020-2021-1《信息安全系统设计》Linux下C语言实现Myod

2020-2021-1《信息安全系统设计》Linux下C语言实现Myod

一、题目要求

  1. 复习c文件处理内容
  2. 编写myod.c 用myod XXX实现Linux下od -tc -tx XXX的功能
  3. main与其他分开,制作静态库和动态库
  4. 编写Makefile
  5. 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
  6. 在博客园发表一篇博客,重点写遇到的问题和解决过程

二、设计思路

od(OctalDump)命令系统默认的显示方式是八进制。

od命令一般用来查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。

语法:od [-A 地址进制] [-t 显示格式]文件

其中本次作业中需要实现的是:

-tc:输出ASCII字符及反斜杠序列(如\n)
-tx:输出十六进制数
实现指令:myod -tc -tx XXX.txt

三、实现方案

C语言读取命令行

int main(int argc,char *argv[])

注意在列表argv[]中,是从运行程序指令开始存储的

-tc函数

输出ASCII码,主要实现代码

void tc(int i,int j,char ch[])
{
	printf("%07o",16*j);
	j++;

	for(i=0;i<16;i++)
	{
		if(ch[i]=='\n')
		{
			i++;
			putchar(' ');
			printf("\\n");
		}
		if (ch[i]=='\0')
		{
			break;
		}
		putchar(' ');
		putchar(' ');
		printf("%c",ch[i]);
		putchar(' ');
	}
	printf("\n");
}

-tx函数

以十六进制形式输出字符

void tx(int i,int j,char ch[])
{ 
	printf("       ");
	for(i=0;i<16;i++)
	{
		if(ch[i]=='\n')
		{
			i++;
			printf("%3x",'\n');
		}
		if(ch[i]=='\0')
		{
			break;
        }
		printf("%4x",ch[i]);		
	}
}

通过构建静态库生成myod可执行文件

通过构建动态库生成myod可执行文件

通过makefile实现快速操作

makefile

myod_a: main.c ../include/head.h ../libs/libmyod.a 
        gcc main.c -I../include -L../libs -lmyod -o ../bin/myod 
myod_so: main.c ../include/head.h ../libs/libmyid.so 
        gcc main.c -I../include -L../libs -lmyod_so -o ../bin/myod_1 
test: ../bin/myod ../test.txt 
        ./../bin/myod -tc -tx1 ../test.txt 
test_1: ../bin/myod_1 ../test.txt 
        ./../bin/myod_1 -tc -tx1 ../test.txt

运行截图

至此所有作业目标均已达成

四、总结

本次作业尝试制作了myod文件,以及实现了一些简单的基础功能,再次基础上还可以做很多修改,比如如何在Linux下实现控制变量的乱絮输入,即-tc -tx或-tx -tc。同时还可以加入更多的功能,这些都可以在今后的学习的中逐步完善。

五、其余代码

main.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
	int i;
	int flag[2];
	for (i=1;i<argc-1;i++)
	{
		if(strcmp(argv[i],"-tc")==0)
		{
			flag[i-1]=1;
		}
		if(strcmp(argv[i],"-tx1")==0)
		{
			flag[i-1]=1;
		}
	}
	FILE *file=fopen(argv[argc-1],"r");
	run(file,flag);
	return 0;
}

run.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "head.h"

void run(FILE *file,int flag[])
{
	char ch[18];
	int i=0,j=0;
	if(flag[0]+flag[1] == 2)
	{
		while(fgets(ch,17,file)!=NULL)
		{
			tc(i,j,ch);
			j++;
			tx(i,j,ch);
			printf("\n");
		}
		j++;
		printf("%07o",16*(j-1)+i);
		printf("\n");
	}
	else if (flag[0]==1)
	{
		while (fgets(ch,17,file)!=NULL)
		{
			tc(i,j,ch);
			j++;
			printf("\n");
		}
		j++;
		printf("%07o",16*(j-1)+i);
		printf("\n");
	}
	else if (flag[1] == 1)
	{
		while (fgets(ch,17,file)!=NULL)
		{
			tx(i,j,ch);
			j++;
			printf("\n");
		}
		j++;
		printf("%07o",16*(j-1)+i);
		printf("\n");
	}
	fclose(file);
}
posted @ 2020-10-09 23:19  1202李祎铭  阅读(125)  评论(0编辑  收藏  举报