Я пытаюсь написать исполняемый файл C, который будет выдавать результат, идентичный выводу команды xxd
по умолчанию.Например, допустим, у меня есть довольно небольшой текстовый файл с именем test.txt
и исполняемый файл с именем myxxd
Итак, сначала я сделаю тест для сравнения, используя:
$ touch correct-xxdoutput.txt test-output.txt
$ xxd test.txt > correct-xxdoutput.txt
Затем, используя мой исполняемый файл для той же операции, но для другого выходного файла:
$ ./myxxd test.txt > test-output.txt
$ diff correct-xxdoutput.txt test-output.txt
$
Я довольно близко подошел к некоторым догадкам, но мое форматирование всегда как-то не так, и я не совсем понимаю конкретнокак xxd
генерирует hexDump.Такое ощущение, что я просто выбрал совершенно неправильный подход, но, может быть, задача просто не соответствует моему потенциалу с моим текущим уровнем знания языка C.
Мой код (см. Также: https://pastebin.com/Vjkm8Wb4):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 256
//Prototypes
void hexDump(void*, int);
int main(int argc, char *argv[])
{
//Create and open filestream
FILE *myfile;
myfile =fopen(argv[1],"rb");
for ( ; ; )
{
unsigned char buffer[SIZE];
size_t n = fread(buffer, 1, SIZE, myfile);
if (n > 0)
hexDump(buffer, n);
if (n < SIZE)
break;
}
fclose(myfile);
return 0;
}
void hexDump (void *addr, int len)
{
int i;
unsigned char bufferLine[17];
unsigned char *pc = (unsigned char*)addr;
for (i = 0; i < len; i++)
{
if ((i % 16) == 0)
{
if (i != 0)
printf (" %s\n", bufferLine);
if (pc[i] == 0x00) exit(0);
printf ("%08x: ", i);
}
// Prints Hexcdoes that represent each chars.
printf ("%02x", pc[i]);
if ((i % 2) == 1)
printf (" ");
if ((pc[i] < 0x20) || (pc[i] > 0x7e))
{
bufferLine[i % 16] = '.';
}
else
{
bufferLine[i % 16] = pc[i];
}
bufferLine[(i % 16) + 1] = '\0'; //Clears the next array buffLine
}
while ((i % 16) != 0)
{
printf (" ");
i++;
}
printf (" %s\n", bufferLine);
}