zoukankan      html  css  js  c++  java
  • 选做作业: 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]==''&&filestr[i-1]!=''){
    			flag=0;
    			k=i;
    		}
    		if(i%16==0){
    			if(flag)
    				k=i;
    			printf("
    %08x",k*2);
    			if(!flag)
    				break;
    		}
    		if(i%4==0)
    			printf("	%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("
    	");
    			for(;j<=i&&filestr[j]!='';j++){
    				if(filestr[j]!='
    ')
    					printf("   %c",filestr[j]);
    				else
    					printf("   \n");
    			}
    		}
    		i++;
    	}
    	putchar('
    ');
    }
    

    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!
    ");
    		return -1;
    	}
    	fread(filestr,256,sizeof(char),fp);
    	myod();
            return 0;
    } 
    

    实现思路

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

    main函数:

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

    myod函数:

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

    实现过程

    在完成各个文件的编写后,就可以开始进行编译,使用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

  • 相关阅读:
    Firefly官方教程之DBentrust使用文档
    《烽烟OL》简介
    《暗黑世界》简介
    CrossApp简介
    内联元素于与块元素的转换 相对定位、绝对定位以及fixed定位 Z轴覆盖
    div介绍 盒子模型边框属性 CSS初始化 文字排版 边框调整 溢出
    CSS样式补充第二天
    CSS样式
    form表单以及内嵌框架标签
    html对a标签的运用以及属性,img图像标签的属性及应用
  • 原文地址:https://www.cnblogs.com/Ressurection-20191320/p/15331587.html
Copyright © 2011-2022 走看看