• 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字符及反斜杠序列(如
    )
    -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]=='
    ')
    		{
    			i++;
    			putchar(' ');
    			printf("\n");
    		}
    		if (ch[i]=='')
    		{
    			break;
    		}
    		putchar(' ');
    		putchar(' ');
    		printf("%c",ch[i]);
    		putchar(' ');
    	}
    	printf("
    ");
    }
    

    -tx函数

    以十六进制形式输出字符

    void tx(int i,int j,char ch[])
    { 
    	printf("       ");
    	for(i=0;i<16;i++)
    	{
    		if(ch[i]=='
    ')
    		{
    			i++;
    			printf("%3x",'
    ');
    		}
    		if(ch[i]=='')
    		{
    			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("
    ");
    		}
    		j++;
    		printf("%07o",16*(j-1)+i);
    		printf("
    ");
    	}
    	else if (flag[0]==1)
    	{
    		while (fgets(ch,17,file)!=NULL)
    		{
    			tc(i,j,ch);
    			j++;
    			printf("
    ");
    		}
    		j++;
    		printf("%07o",16*(j-1)+i);
    		printf("
    ");
    	}
    	else if (flag[1] == 1)
    	{
    		while (fgets(ch,17,file)!=NULL)
    		{
    			tx(i,j,ch);
    			j++;
    			printf("
    ");
    		}
    		j++;
    		printf("%07o",16*(j-1)+i);
    		printf("
    ");
    	}
    	fclose(file);
    }
    
  • 相关阅读:
    nginx 配置https 负载均衡
    MyCAT+MySQL搭建高可用企业级数据库集群视频课程
    Java数字签名算法--RSA
    bootstrap在iframe框架中实现由子页面在顶级页面打开模态框(modal)
    bootstrap-treeview 自定义实现双击事件
    Java多线程之内存可见性
    Java实现责任链模式
    JVM(HotSpot) 7种垃圾收集器的特点及使用场景
    jQuery的noConflict以及插件扩展
    JavaScript事件漫谈
  • 原文地址:https://www.cnblogs.com/peterlddlym/p/13789503.html
Copyright © 2020-2023  润新知