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.



4. Re: Eliminar hexadecimais de controle do HD em C

Gerald pennington
Geraldpennington

(usa Kali)

Enviado em 14/11/2022 - 05:48h

Try grep, like:

grep -o "[[:print:][:space:]]*" in.txt > out.txt
which will print only alphanumeric characters including punctuation characters and space characters such as tab, newline, vertical tab, form feed, carriage return, and space.

To be less restrictive, and remove only control characters ([:cntrl:]), delete them by:

tr -d "[:cntrl:]"
If you want to keep \n (which is part of [:cntrl:]), then replace it temporarily to something else, e.g.

cat file.txt | tr '\r\n' '\275\276' | tr -d "[:cntrl:]" | tr "\275\276" "\r\n"
https://www.mywawavisit.onl/






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts