博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C语言实现Linux命令——od

Posted on 2017-09-30 10:47  20155217杨笛  阅读(221)  评论(1编辑  收藏  举报

C语言实现Linux命令——od

实现要求:

  • 复习c文件处理内容
  • 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
  • main与其他分开,制作静态库和动态库
  • 编写Makefile
  • 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

linux下od命令的使用

  • 作用:格式化输出文件中的数据
  • 说明:常见的文件为文本文件二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出他们的值。
  • 格式:od [<选项><参数>] [<文件名>]
  • 常用的命令选项:
1. A<RADIX>,--address-radix=RADIX:选择以何种基数表示地址偏移;
2. -j<BYTES>,--skip-bytes=BYTES:跳过指定数目的字节;
3. -N,--read-bytes=BYTES:输出指定字节数;
-S<BYTES>, --strings[=BYTES]:输出长度不小于指定字节数的字符串;
4. -v,--output-duplicates:输出时不省略重复的数据; 
5. -w<BYTES>,--width=<BYTES>:设置每行显示的字节数,od默认每行显示16字节。如果选项--width不跟数字,默认显示32字节;
6. -t<TYPE>,--format=TYPE:指定输出格式,格式包括a、c、d、f、o、u和x,各含义如下:
 a:具名字符;
 c:ASCII字符或者反斜杠;
 d[SIZE]:十进制,正负数都包含,SIZE字节组成一个十进制整数;
 f[SIZE]:浮点,SIZE字节组成一个浮点数;
 o[SIZE]:八进制,SIZE字节组成一个八进制数;
 u[SIZE]:无符号十进制,只包含正数,SIZE字节组成一个无符号十进制整数;
 x[SIZE]:十六进制,SIZE字节为单位以十六进制输出,即输出时一列包含SIZE字节。
--help:在线帮助; 
--version:显示版本信息。

设计思路:

  • 要实现的od -tc -tx1 XXX命令,-tc表示输出ASCII字符,-tx1表示以十六进制输出,每组输出一字节。
  • 利用printf函数的输出控制字符串的控制代码,可以方便输出字符变量的ASCII值。
  • 通过控制转换说明符来规定输出形式
显示ASCII字符的代码ascii.c:
#include "head.h"
#include <stdio.h>
void ascii(char *name)
{
  FILE *fp;
  char ch;
    fp=fopen(name,"r");
    ch=fgetc(fp);
  printf("output the ascii:\n");

  while(ch!=EOF)
  {
     if(ch=='\n')
        printf("\n");
     else
        printf("%4d",ch);
        ch=fgetc(fp);
  }
  fclose(fp);

}
显示十六进制输出的代码hex.c:
#include "head.h"
#include <stdio.h>
void hex(char *name)
{
  FILE *fp;
  char ch;
  printf("output the hex:\n");
  fp=fopen(name,"r");
  ch=fgetc(fp);
  while(ch!=EOF)
  {
    if(ch=='\n')
    printf("\n");
    else
    printf("%4x",ch);
    ch=fgetc(fp);
   }
   fclose(fp);
}

主函数代码MyOD.c:
#include "head.h"
#include <stdio.h>
void main()
{ 
  char name[50];
  printf("please input the txtname:");
  scanf("%s",name);
  ascii(name);
  hex(name);
}
用myod XXX实现Linux下od -tx -tc XXX的功能代码运行截图:

静态库实现过程及截图:

ar cr MyOD.a hex.o ascii.o
gcc -o MyOD MyOD.c ./MyOD.a

动态库实现过程及截图:

gcc shared -fpic -o MyOD.so ascii.c hex.c
gcc -o MyOD2 MyOD.c ./MyOD.so

makefile文件制作及运行截图:
testmymath:MyOD.o hex.o ascii.o
	 gcc MyOD.o hex.o ascii.o -o testmymath
MyOD.o:MyOD.c head.h
	gcc -c MyOD.c
hex.o:hex.c head.h
	gcc -c hex.c
ascii.o:ascii.c head.h
	gcc -c ascii.c

出现的问题:

最初编写的时候没有考虑输出宽度的问题,运结果数字堆叠到一起。

  • 有两种方式修改:printf("%4x",ch) or printf("%x ",ch)

运行Makefile文件时出现的问题: 修改代码,将录入的空格键换成TAB录入。