gpt4 book ai didi

c - 我如何像UNIX中的Hexdump函数一样打印出地址

转载 作者:行者123 更新时间:2023-11-30 18:05:20 28 4
gpt4 key购买 nike

我有一个作业,我应该在其中模拟 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 添加到我的地址变量中并继续打印

最佳答案

由于这是家庭作业,我只会为您提供一些如何解决问题的指导。我会尽可能含糊其辞,以免干扰您的学习。

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

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

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

关于c - 我如何像UNIX中的Hexdump函数一样打印出地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6591330/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com