在那里我有这个任务,我想从 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 添加到我的地址变量并继续打印