Как вывести массив 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*
Как мне правильно вывести массив?
Извините за польский. Думаю, здесь оно не критично.