【问题标题】:How would I print out the address like the Hexdump function in UNIX我如何像 UNIX 中的 Hexdump 函数一样打印出地址
【发布时间】:2011-07-06 03:44:24
【问题描述】:

我有这个任务,我想从 unix 模拟 hexdump 函数。我让我的程序将文件转储为十六进制,但在打印偏移量和可打印字符时遇到问题。

这是我的代码:

/*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 添加到我的地址变量并继续打印

【问题讨论】:

    标签: c hex hexdump


    【解决方案1】:

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

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

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

    就您的零填充问题而言,阅读the printf man page,您的"%5d" 格式字符串需要更多。

    【讨论】:

    • 不使用 fread,我可以使用 fgetc 逐个字符地读取它,然后限制放在屏幕上的字符数吗?
    • @user830812:我想你可以,但我不知道你为什么想要。您需要一整行的字节才能产生任何输出,那么为什么不 fread 一次 16 个字节呢?
    • 我正在尝试用 fread 替换 while 循环的 sscanf 部分,但我认为它现在不会通过循环
    • @user830812:确保您正在检查来自fread 的正确返回值。
    • i = fread(temp, sizeof(temp), 16, fp); printf("%d", i);我这样做是为了检查返回值显然为零,​​所以我的循环甚至根本没有进行
    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多