Как бы я распечатать адрес, как функция Hexdump в UNIX - PullRequest
0 голосов
/ 06 июля 2011

Там у меня есть это назначение, где я должен эмулировать функцию hexdump из unix. У меня есть программа для выгрузки файлов в шестнадцатеричный формат, но у меня проблемы с печатью смещения и печатных символов.

Вот мой код:

/*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");
    }
}

Как я уже говорил выше, моя программа должна печатать смещение, затем шестнадцатеричное значение файла, дополненное нулями, а затем печатаемые символы файла, например, так.

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: По какой-то причине моя программа по каким-то причинам не дополняет нуля.

РЕДАКТИРОВАТЬ1: я получил смещение, я просто добавляю 16 к моей переменной адреса и продолжаю печатать

1 Ответ

0 голосов
/ 06 июля 2011

Поскольку это домашнее задание, я просто дам вам несколько советов о том, как подойти к вашей проблеме.Я буду настолько смутным, насколько смогу, чтобы не мешать вашему обучению.

Прежде всего, не используйте fscanf, если вы пишете шестнадцатеричный дампер,используйте взамен fread.Семейство функций scanf предназначено для текста, а шестнадцатеричные дамперы обычно используются с двоичными данными.

Если вы используете fread и считываете достаточно байтов за раз, чтобы заполнить одну строку вывода, то выможет выдать желаемый результат с помощью двух for циклов (один для шестнадцатеричного числа, один для символов), за которым следует одна новая строка.

Что касается проблемы с заполнением нулями, прочитайте man printfpage , вашей строке формата "%5d" нужно немного больше.

...