Как вывести массив Hex?

Вопрос, кажется, простой, но что-то я не могу его решить. Как можно вывести массив типа char в HEX формате, где отдельные элементы отделены пробелами и по 15 элементов в строке?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

#define READ        0
#define WRITE       1
#define N 10000000

char string[N];
char hex[2*N];

void clear(char *tab, int arg)
{
    int i;
    for(i = 0; i < arg; i++)
    {
        tab[i] = 0;
    }
}

void clear_stdin()
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF){
        continue;
    }
}

char plik_read(char* string)
{
    FILE *file;
    char ADRES[256];
    printf("Wpisz adres pliku razem z formatem! \n");
    fflush(stdout);
    
    if (strchr(ADRES, '\n') == NULL) {
        clear_stdin();
    }
    
    if (fgets(ADRES, 256, stdin) == NULL) {
        /* Ma miejsce błąd lub został przeczytany EOF */
    }
    else {
        /* Usuwamy symbol końca wierza */
        size_t last = strlen(ADRES) - 1;

        if (ADRES[last] == '\n')
            ADRES[last] = '\0';

        /* Tutaj można przeanalizować wiersz */
    }
    printf("\n\n");
    if ((file = fopen(ADRES, "r+")) == NULL)
    {
        printf("Nie udalo sie otworzyc pliku, uruchom ponownie! \n");
        _exit(0);
    }
    else
    {
        while(!feof (file)) {
            if (fread(string , sizeof(char), N, file))
                printf("%s", string);
        }
        fclose(file);
    }
    return *string;
}

char plik_write(char* string)
{
    int fp;
    fp = creat("file.dat", S_IREAD|S_IWRITE);
    if (fp == -1)
    {
        printf ("Nie moge utworzyc file.dat \n");
        _exit(0);
    }
    write (fp, string, N);
    close (fp);
    
    return *string;
}

int main()
{       
        if(fork() == 0)
        {
            char c='N';
            printf("Tekst znajduje sie w pliku? Y/N? --> ");
            fflush(stdout);
            scanf ("%c", &c);
            printf("\n");

            if(c=='Y')
            {
                plik_read(string);
                printf("\n\n");
                plik_write(string);
                clear(string, N);           
            }
            else
            {
                printf("Wpisz tekst: \n\n");
                fflush(stdout);
                
                if (strchr(string, '\n') == NULL) {
                clear_stdin();
                }
                
                fgets(string, N, stdin);
                printf("\n");
                plik_write(string); 
                clear(string, N);
                //~ for(int i=0; i<strlen(string); i++)
                //~ printf("%c", string[i]);    
            }
            
            /* tablica przechowujaca uchwyty na pliki odczytu i zapisu */
            int pdes[2];
            /* tworzymy pipe skladajaca sie z uchwytu do plikow do odczytu
            * i do zapisu (R i W); deskryptory zostana umieszczone w tablicy */
            pipe(pdes);
            
            if(fork() == 0)
                {
                    
                    FILE *fp;
                    
                    /* zamykamy niepotrzebny deskryptor */
                    close(pdes[READ]);

                        sleep(1);
                        fp = fopen("file.dat", "r+");           
                    
                            while(!feof (fp)) {
                                if (fread(string , sizeof(char), N, fp))
                                printf("%s \n", string);
                            }
                            fclose(fp);
                            
                            int len = strlen(string);

                              // Konwertowanie string to hex
                              
                              for (int i = 0, j = 0; i < len; ++i, j += 2)                            
                                sprintf(hex + j, "%02x", string[i] & 0xff);

                            printf("%s \nin hex is \n%s\n", string, hex);
                            
                            clear(string, N);

                        /* wysylamy podany ciag znakow przez pipe */
                        write(pdes[WRITE], hex, strlen(hex));

                }
                else
                {
                    if(fork()==0)
                    {
                        /* zamykamy niepotrzebny deskryptor */
                        close(pdes[WRITE]);

                            /* odbieramy cag znakow z pipe */
                            read(pdes[READ], hex, sizeof(hex));
                            
                            int len = strlen(hex);
                            
                            for (int i=0, j=1; i<100; i++, j++)
                            {                               
                                fprintf(stderr, "%s%s ", hex[i], hex[i+1]);
                                    if(j==15)
                                    {
                                        fprintf(stderr, "\n");
                                        j = 0;
                                    }
                            }
                            clear(hex, 2*N);
                    }
                }
        }
        
    for(;;)
    pause();
        
    return 0;
}

Собственно говоря, вопрос кроется здесь:

for (int i=0, j=1; i<100; i++, j++)
{                               
    fprintf(stderr, "%s%s ", hex[i], hex[i+1]);
    if(j==15)
    {
        fprintf(stderr, "\n");
        j = 0;
    }
}

Данный код не компилируется именно из-за этой строчки:

fprintf(stderr, "%s%s ", hex[i], hex[i+1]);

Где я пытаюсь вывести уже сконвертированный до HEX формы массив char. Ошибка компилятора: hex[i] имеет формат int, не char*

Как мне правильно вывести массив?

Извините за польский. Думаю, здесь оно не критично.


Ответы (0 шт):