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%还原。