20181312 2020-2021-1 《信息安全系统设计与实现(上)》用myod实现Linux下od -tx -tc功能

20181312 2020-2021-1 《信息安全系统设计与实现(上)》用myod实现Linux下od -tx -tc功能

我首先查阅了od的功能

man od

测试od功能

od -tx hello.txt
od -tc hello.txt
od -tc -tx hello.txt

可以看到od -tc是把文件内容一个字符一个字符输出,od -tx是把文件内容的每个字符的十六进制表示输出。

于是我编写了myod.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argv,char *argc[]){
	FILE *fp;
	fp=fopen(argc[1],"rb");
	if(fp==NULL){
		printf("Failure to open file\n");
		return 0;
	}
	char ch;
	char STR[1000];
	int i,n;
	i=0;
	while((ch=fgetc(fp))!=EOF){
		STR[i]=ch;
		i++;
	}
	STR[i]='\0';
	fclose(fp);
	od(STR,i);
}

用于打开文件和关闭文件

调用od.c实现od -tc -tx功能

#include "head.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void od(char STR[1000], int i)
{
    int k = 1;
    int j = 0;
    int m = 0;
    int line = 0;
    printf("%06d  ", line);
    putchar(STR[0]);
    for (k = 1; k <= i; k++)
    {
        if (k % 16 != 0 && STR[k] != '\0')
        {
            if (STR[k] != '\n')
            {
                printf("  %2c", STR[k]);
                continue;
            }
            else
            {
                printf("  \\n");
                continue;
            }
        }
        else
        {
            printf("\n      ");
            for (j = m; j < k; j++)
            {
                printf("  %02x", STR[j]);
            }
            printf("\n%06d", k + 2);
            m = k;
        }
    }
    printf("\n");
}

head.h

#ifndef HEAD_H
#define HEAD_H
void od(char STR[],int);
#endif

makefile

myod: ./src/myod.c ./src/od.c ./include/head.h
	gcc ./src/myod.c ./src/od.c -Iinclude -o ./bin/myod

过程中我遇到的主要问题就是od.c输出字符到屏幕时无法像od本身对齐的那样,我不断修改输出时的空格与换行,但是目前呈现的也没能做到100%还原。

posted @ 2020-10-11 22:24  临渊履冰  阅读(82)  评论(0编辑  收藏  举报