Converter código HEX em arquivos binários [RESOLVIDO]

1. Converter código HEX em arquivos binários [RESOLVIDO]

Cristiano Almeida
calmeidaluz

(usa Debian)

Enviado em 01/02/2018 - 18:26h

Olá, estou trabalhando em um programa que converte arquivos binários em código hexadecimal, depois de muita pesquisa consegui converter os arquivos corretamente para HEX, mas estou tendo problemas em fazer o processo inverso.

Abaixo esta o código que estou usando para ler um arquivo de imagem e converter para HEX.
Testei em um site a conversão para imagem do código gerado e funcionou.

char *fnp = "imagem.png";
size_t size;
FILE *fp;

fp = fopen(fnp,"rb");

if( fp == NULL )
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}

// Move o ponteiro para o final do arquivo
fseek(fp,0,SEEK_END);

// pega a posicao atual do ponteiro no arquivo
size = ftell(fp);

// Volta o ponteiro para a posicao inicial do arquivo
rewind(fp);

/*
* Listagem do conteudo do arquivo em hexadecimal
*/
char *sfinal = malloc((size * 8) + 1);


size_t i;
char *buffer = NULL;
int brk = 0;

buffer = malloc(size + 1);

fread(buffer, 1, size, fp);
for(i = 0; i < size; i++)
{
char hex[8];
sprintf(hex, "%.2X ", (unsigned int) buffer[i] & 0xff);
strcat( sfinal, hex );

if( !(++brk % 16) ) strcat( sfinal, "\n" );
}

free(buffer);
buffer = NULL;


//Fechamento do arquivo
fclose(fp);


Se alguem tiver alguma ideia de como fazer o inverso, vai ajudar muito.
Tentei varias códigos e até agora nada.
Vlw =)


  


2. Re: Converter código HEX em arquivos binários

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/02/2018 - 11:59h

Prezado,

Seu código me pareceu um pouco complicado demais. Talvez por isso você esteja com dificuldade de fazer o código inverso.

Como a comunidade não tem por hábito dar respostas prontas, em vez de lhe mostrar um código que converta de texto haxadecimal em binário, vou lhe mostrar um código que converte de binário em texto hexadecimal que, creio, será mais fácil de usar para entender como fazer o algoritmo inverso do que o código que você mostrou.

FILE *bin, *txt;
if((bin=fopen(BINARY_FILENAME, "rb")==NULL){
fprintf(stderr, "Erro ao abrir arquivo de origem: %s.\n", strerror(errno));
exit(1);
}
if((txt=fopen(HEXTXT_FILENAME, "w")==NULL){
fprintf(stderr, "Erro ao abrir arquivo de saída: %s.\n", strerror(errno));
exit(1);
}
int data_byte; // Note que eu estou usando int, que é o tipo de retorno de fgetc().
size_t count=0;
while((data_byte=fgetc(bin))!=EOF){
++count;
int written_len=fprintf(txt, "%02X", data_byte);
if(written_len!=2){
fprintf(stderr, "Falha de escrita após ter lido %zd bytes: %s.\n", count, strerror(errno));
exit(1);
}
if((count&0xF)==0)
fputc('\n', txt); // Uma quebra de linha na saída a cada 16 bytes.
}
if(fclose(txt)==EOF){
fprintf(stderr, "Falha de escrita após ter lido %zd bytes: %s.\n", count, strerror(errno));
exit(1);
}
fclose(bin);


Para construir o algoritmo inverso, você teria de inverter, nas chamadas a fopen(), quem está sendo lido e quem está sendo escrito. No laço de repetição, o arquivo de leitura continua sendo a condição de controle (só que o arquivo de leitura agora é o outro), o que era fprintf() vira fscanf() e o que era fgetc() vira fputc() (você não vai precisar de se preocupar com o que era fputc(), porque o fscanf() pode pular aquelas quebras de linha por você).

Detalhes dos quais você deve cuidar: verifique que, ao ler, o fscanf() sempre consuma dois dígitos hexadecimais para produzir um byte (dica: use na string de formatação espaços e duas pseudoconversões "%n", e teste o valor de retorno da função e a diferença entre os valores recebidos com as pseudoconversões), e teste também se a escrita no destino foi bem sucedida.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts