20181202 李祎铭 2020-2021-1《信息安全系统设计》Linux下C语言实现Myod
2020-2021-1《信息安全系统设计》Linux下C语言实现Myod
一、题目要求
- 复习c文件处理内容
- 编写myod.c 用myod XXX实现Linux下od -tc -tx XXX的功能
- main与其他分开,制作静态库和动态库
- 编写Makefile
- 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
- 在博客园发表一篇博客,重点写遇到的问题和解决过程
二、设计思路
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);
}