繁体   English   中英

我如何在 UNIX 中打印出像 Hexdump function 这样的地址

[英]How would I print out the address like the Hexdump function in UNIX

我有这个任务,我想从 unix 模拟 hexdump function。 我让我的程序将文件转储为十六进制,但我无法打印偏移量和可打印字符。

这是我的代码:

/*performs a hex and an octal dump of a file*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define LINESIZE 512

void hexdump(FILE *fp);
void octaldump(FILE *fp);

int main(int argc, char * argv[])
{
    FILE *fp;

   if((fp = fopen(argv[1], "rb+")) == '\0')
   {
    perror("fopen");
    return 0;
   }

   hexdump(fp);

   return 0;
}

void hexdump(FILE *fp)
{
   char temp [LINESIZE];
   size_t i = 0;
   size_t linecount = 1;
   long int address = 0;


   while(fscanf(fp," %[^\n] ", temp) == 1)
   {
     printf("%5d", address);

     for(i = 0; i < strlen(temp); i++)
     {
        printf("%02x ", temp[i]);

        if(linecount == 16)
        {
            printf("\n");
            linecount = 0;          
        }
        linecount++;
     }
     printf(" | ");

     for(i = 0; i < strlen(temp); i++)
     {
         if(temp[i] < 32)
         {
            printf(".");
         }
         else
         {
             printf("%c", temp[i]);
         }
     }
     printf("\n");
    }
}

正如我上面所说,我的程序假设先打印偏移量,然后打印文件的十六进制值,然后用 0 填充,然后像这样打印文件的可打印字符。

0000000 7f 2a 34 f3 21 00 00 00 00 00 00 00 00 00 00 00 | test file

我设法打印出可打印的字符,但它们出现在十六进制部分之后。 因此,如果一行十六进制代码延伸到下一行,它将在下一行打印可打印的字符。

例如:

2a 3b 4d 3e 5f
12 43 23 43 | asfdg df

我如何让它打印一行十六进制字符之后出现的任何字符?

PS:出于某种原因,我的程序由于某种原因没有填充 0。

EDIT1:我得到了偏移部分,我只是不断将 16 添加到我的地址变量并继续打印

由于这是家庭作业,我只会给你一些关于如何解决问题的指示。 我会尽量含糊其辞,以免干扰你的学习。

首先,如果您正在编写十六进制转储程序,请不要使用fscanf ,而是使用fread scanf系列函数用于文本,十六进制转储程序通常用于二进制数据。

如果您使用fread并一次读取足够的字节来填充 output 的一行,那么您可以生成所需的 output,其中包含两个for循环(一个用于十六进制,一个用于字符),后跟一个换行符。

至于您的零填充问题,请阅读printf手册页,您的"%5d"格式字符串需要更多一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM