选做作业: MyOD

对OD的理解

Linux od命令用于输出文件内容。本次选做作业中的od -tx -tc的意思就是将一个文件输出为包含文件ascii码、以及16进制的输出格式。
首先尝试在OpenEuler中直接使用od -tx -tc test.txt输出测试用的txt文档:

发现输出格式为:最左侧是当前行开始的16进制字节号,然后后面输出的就是每个字节的值了,注意每4个字节是倒过来输出的。然后偶数行就是按照顺序输出的每个字符。

自己实现的MyOD

多次长时后实现了我的OD程序,程序结构简单,分为一个主函数和一个myod函数。

myod.h头文件代码

#ifndef __MYOD_H__
#define __MYOD_H__

extern char filestr[256];

void myod();
#endif

myod.c文件代码

#include "myod.h"
#include <stdio.h>

char filestr[256];

void myod(){
	int i=0,j=0,k,flag=1;
	while(1){
		if(filestr[i]=='\0'&&filestr[i-1]!='\0'){
			flag=0;
			k=i;
		}
		if(i%16==0){
			if(flag)
				k=i;
			printf("\n%08x",k*2);
			if(!flag)
				break;
		}
		if(i%4==0)
			printf("\t%02x",filestr[i+3]);
		if(i%4==1)
			printf("%02x",filestr[i+1]);
		if(i%4==2)
			printf("%02x",filestr[i-1]);
		if(i%4==3)
			printf("%02x",filestr[i-3]);
		if(i%16==15){
			printf("\n\t");
			for(;j<=i&&filestr[j]!='\0';j++){
				if(filestr[j]!='\n')
					printf("   %c",filestr[j]);
				else
					printf("   \\n");
			}
		}
		i++;
	}
	putchar('\n');
}

main.c主函数文件代码

#include "myod.h"
#include <stdio.h>

char  filestr[256]={0};

int main(){
        FILE* fp;
	char filename[64];
	printf("Please input the filename:");
        scanf("%s",filename);
	if((fp=fopen(filename,"r"))==NULL){
		printf("failed to open file!\n");
		return -1;
	}
	fread(filestr,256,sizeof(char),fp);
	myod();
        return 0;
} 

实现思路

整个程序较为简单,但也尝试和调试了很多次才完成,以下为整个程序的实现思路。

main函数:

main函数思路:main函数的功能很简单,就是将文件进行读取。我在头文件中声明了一个buf字符数组型变量,存储了整个文件的内容。main函数的功能就是询问读取的文件名,然后进行读取,将文件内容存储到buf中。

myod函数:

这个函数就是输出结果、排版用到的函数了。整体思路是结合循环和判断条件的方式,最终得到了想要的结果。当输出时,首先进行换行,也就是在i能被16整除的时候,这时输出当前的位置,然后按照每4个一组的方式进行输出。最后在每一行末,再加入一行,作用就是输出以字符形式排布的文件。这时,需要注意换行符,不能按原封不动输出,需要进行转义,按符号'\n'进行输出。

实现过程

在完成各个文件的编写后,就可以开始进行编译,使用makefile进行完成。

编译使用的makefile

OBJ:bin/myod lib/libmyod.a lib/libmyod.so

bin/myod: lib/myod.o src/main.c
	gcc -static src/main.c -Iinclude -Llib -lmyod  -o bin/myod
lib/myod.o: src/myod.c
	gcc -c -fPIC src/myod.c -Iinclude -o lib/myod.o
lib/libmyod.a: lib/myod.o
	ar rcs lib/libmyod.a lib/myod.o
lib/libmyod.so: lib/myod.o
	gcc -shared -o lib/libmyod.so lib/myod.o

一个makefile文件,同时完成静态库、动态库的生成,以及使用静态库进行的编译,最后成功

最后的结构tree图

运行效果图、对比

在同一个文件上使用myod和使用od -tx -tc进行了测试,以下为对比。
myod:

od -tx -tc:

可以看到,我自己的myod和od -tx -tc的效果还是很相似的。

遇到的问题

编译链接时的问题

刚开始我在实现程序时使用的全局变量,刚开始只是在.h文件中声明,随后报错,出现了重定义问题,一直无法解决,后面查阅资料参考了这个资料,得知在.h中只需要使用extern进行声明,在各个需要使用的.c中才进行定义,这样就解决了全局变量的问题。

有关od输出的问题

出现了一个问题,在最后一行,最后一行可以发现输出的位置量和od -tx -tc是不同的,这个我仍没有理解,od中这个量的意义?暂时没有解决这个问题。

代码链接

代码已经上传码云:https://gitee.com/Ressurection20191320/code/tree/master/IS/myod

posted @ 2021-09-24 18:07  20191320  阅读(88)  评论(0编辑  收藏  举报