Eliminar hexadecimais de controle do HD em C

1. Eliminar hexadecimais de controle do HD em C

Mistery
Cmistry

(usa Ubuntu)

Enviado em 06/08/2022 - 12:33h


Galera, estava montando um arquivo.c para visualizar o conteúdo hexdump. Até onde fiz, entendi e funciona como deveria.
O negocio é que gostaria de remover os valores hexas não caracteres.

<stdio.h>
#define BLOCOS 16
FILE *Abre_hexdump(const char *caminho, const char *mode) {
FILE *fp;
if (!(fp = fopen(caminho, mode))){
printf("error ao abrir '%s'", caminho);
return 0;
}return fp;
}
int main(int argc, char const *argv[]){
FILE *fp_in, *fp_out;
unsigned char buf[BLOCOS];
size_t nread;
int i, c, npos;

if (argc < 2 || argc > 3){
printf("use: %s <file-in> [file-out]\n", argv[0]);
return 0;
}/* Abre o arquivo de entrada */
fp_in = Abre_hexdump(argv[1], "r");
/* Redirecionar a saída se um arquivo de saída for definido */
fp_out = (argc == 3 ? Abre_hexdump_open(argv[2], "w") : stdout);
npos = 0;
/* Exibir BLOCOS de bytes dos dados hexadecimais de cada vez */
while ((nread = fread(buf, 1, sizeof buf, fp_in)) > 1) {
fprintf(fp_out, "%04x: ", npos);
npos += BLOCOS;
/* print valores hexadecimais, exemplo 3f 62 ec f0*/
for (i = 0; i < BLOCOS; i++)
fprintf(fp_out, "%02x ", buf[i]);
/* print valores ascii ..A6..ó.j...D*/
for (i = 0; i < BLOCOS; i++) {
c = buf[i];
fprintf(fp_out, "%c", (c >= 33 && c <= 255 ? c : '.'));
}fprintf(fp_out, "\n");
}fclose(fp_in);
return 0;
}

Tentei limitar-lo naquela linha comentada valores hexadecimais no fprintf com

(buf[i] >= 33 || buf[i] <=126); ou, >0x20 && <=0x7e

Mas o valores saem todos zerados ou com 01.
Da parte comentada no qual imprime os valores ascii, é sabido que se remover

"%c", (c >= 33 && c <= 255 ? c : '.')

e deixar somente fprintf(fp_out, "%c", c), imprime sem os pontos tracejados.



  


2. Re: Eliminar hexadecimais nao caracteres ascii do HD em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/08/2022 - 03:40h

Normalmente você faria algo como o seguinte:
putchar(isprint(c)? c: '.'); 


isprint() é declarada em <ctype.h>, e o argumento da função deve ser um valor do tipo int que também possa ser representado como unsigned char ou EOF (ou seja: um valor inteiro entre 0 e 255 ou o valor da constante EOF, que tipicamente vale -1).

Em tempo: não é tecnicamente correto dizer “hexadecimais não-caracteres”, particularmente no contexto do C. Antes, é melhor falar de bytes que correspondem caracteres que podem ser (facilmente) impressos (que é justamente o que a função isprint() testa), em contraposição bytes que indicam caracteres de controle (por exemplo: toda a faixa de 0 a 31 mais o de valor 127) ou outros caracteres cujo comportamento pode variar de sistema para sistema (como os de 128 a 255, bem como os de 256 em diante, se você estender para caracteres com mais de um byte).


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


3. isprint() retorna verdadeiro se um char é

Mistery
Cmistry

(usa Ubuntu)

Enviado em 07/08/2022 - 04:22h


(isprint(buf[i])?buf[i]:'a') 

Só consegui fazer com que isprint substituísse os bytes de controle pelo valor hexadecimal do bloco contido entre as aspas simples, 0x61 = 'a', porem queria que ele ignorasse os valores de controle e arrastasse o valor a frente pro lugar dele, que seria 0x45, ..., 0x46.
i.e, anulasse esses bytes que indicam caracteres de controle e arrastasses os valores gráficos, e não substituir os valores de controle por um valor qualquer do bloco entre aspas simples
E não da para deixar essas ' ' (aspas simples) vazia.
Ex.:
(isprint(buf[i])?buf[i]:'') 

E se tem espaço entre as aspas simples, ele retorna seu valor como ,' ' o espaço 0x20.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts