Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C/C++]Convertire file di testo da esadecimale a binario ascii, potete aiutarmi?

    Salve a tutti.
    Dato un file binario ascii utilizzando un algoritmo che ho trovato in rete sono riuscito ad ottenere il file esadecimale corrispondente. Ecco ,a me interesserebbe avere anche l'esatto contrario, ossia dato un file di testo che contiene solo caratteri esadecimali
    ad esempio
    "4369616F204D6F6E646F21212121"
    che mi restituisca un file di testo convertito, in questo caso
    "Ciao Mondo!!"
    è ovvio che occorre controllare due caratteri per volta. Grazie in amticpo per l'aiuto. Cordial saluti. Ciaoo.
    il codice che ho sato per le conversioni da testo normale ascii a testo corrispondente esadecimale è
    codice:
    FILE *fp, *fw;
    char c;
    
    if((fp = fopen("C:\`test.bin","rb")) == NULL) return 0;
    if((fw = fopen("C:\\out.txt","wb")) == NULL) return 0;
    
    while((c = fgetc(fp))!=EOF)
    fprintf(fw, "%02X", (unsigned char)c);
    
    fclose(fw);
    fclose(fp);
    Quello che uso invece per la conversione opposta, quello che non funziona, è
    codice:
    FILE *pFile, *fw2;
       if((pFile = fopen("C:\\A\\file2.txt","rb")) == NULL) return 0;
       if((fw2 = fopen("C:\\A\\out2.txt","wb")) == NULL) return 0;
    
    int v;
    char c;
    unsigned char c2;
    while(fscanf(pFile, "%02X", &v)!=EOF)
    {
       c = (unsigned char)v;
       fprintf(fw2, "%c", c2);
    }
    		
    fclose(pFile);
    fclose(fw2);
    dove è l'errore? Mi crea comunque un file di testo, ma contiene tutti caratteri uguali, ÌÌÌÌÌÌÌÌ.
    Grazie in anticipo. Cordiali saluti. Ciaooo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [C/C++]Convertire file di testo da esadecimale a binario ascii, potete aiutarmi?

    Originariamente inviato da Sprunk
    [CODE]int v;
    char c;
    unsigned char c2;
    while(fscanf(pFile, "%02X", &v)!=EOF)
    {
    c = (unsigned char)v;
    fprintf(fw2, "%c", c2);
    }
    Assegni a c ma poi stampi c2.

    Comunque ti segnalo alcune cose: fscanf nel tuo caso può ritornare (oltre che EOF) 1 (= 1 elemento assegnato) oppure 0 (= nessun elemento assegnato). Quest'ultimo caso può succedere se l'input è formato da caratteri non validi per una cifra esadecimale. Ma questo porta ad un altro problema: se fscanf trova un carattere non accettabile, ritorna 0 ma tale carattere rimane nel buffer. Conseguenza: il tuo programma va praticamente in loop infinito. Le funzioni Xscanf purtroppo sono "pericolose" da questo punto di vista, se non si gestisce bene questa questione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Grazie, me n'ero accorto. Ho cambiato la seconda funzione. Adesso però ho un problema, forse quello che stai dicendo te. In pratica Non riesce a convertire un intero file.. probabilment fa una riga sola, poi trova un carattere non valido e si ferma li... In pratica ho provato con un eseguibile a tradurre il suo codice ascii in esadecimale ma vengono solo pochi byte, poi si ferma. Come potrei fare? Se certi caratteri non sono validi per la conversione in esadecimale, volendo potrei far si che il programma li ignori. Poi dovrei modificare la seconda funzione in modo tale che non dia errore se trova caratteri diversi da caratteri esadecimali. Lo scopo finale è un pò strano, ma per adesso devo solo riuscire a fare quanto ho scritto. Hai qualche idea?
    Grazie ancora
    La funzione modificata è
    codice:
    int bintoascii()
    {
    //da binario ad asci
    	FILE *pFile, *fw2;
       if((pFile = fopen("C:\\A\\out.hex","rb")) == NULL) return 0; //file esadecimale
       if((fw2 = fopen("C:\\A\\out2.txt","wb")) == NULL) return 0; //file risultante normale
    
    int v;
    char c;
    unsigned char C;
    while(fscanf(pFile, "%02X", &v)!=EOF)
    {
       C = (unsigned char)v;
       fprintf(fw2, "%c", C);
    }
    		
    fclose(pFile);
    fclose(fw2);
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Sprunk
    probabilment fa una riga sola, poi trova un carattere non valido e si ferma li...
    Ma il file è corretto oppure no? Aprilo con un editor (eventualmente con uno esadecimale).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    In che senso corretto?
    Il file che voglio convertire in esadecimale, o meglio quello che stò usando per le prove, è un file exe, precisamente l'installazione di winrar..... Funzionare funzione..
    In pratica adesso avrei bisogno di un ritocco alla funzione che converte da testo normale a corrispindente esadecimale in modo tale che se trova un carattere non trasformabile venga ignorato, evitando così un errore che mi fa terminare la codifica. Ho letto infatti che EOF non si riferisce soltanto alla fine del file (End Of File), ma anche quando ti verifica un errore. Infine se riiusciamo a sistemare la prima funzione dovrei modificare anche la seconda di consegueenza. Se non hai capita qualcosa chiedimi pure. So che magari non sono stato molto chiaro. Grazie ancora!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Sprunk
    In che senso corretto?
    Il file che contiene le coppie di cifre esadecimali .... è corretto??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Non credo. Finchè si tratta di una sola riga va bene. Quando ci sono più righe, nel ritorno a caso mette 0A e poi prosegue sulla stessa riga. però quando incontra un carattere non valido per la conversione, smette li di convertire. quidni all'atto pratico nel file exe dekll'installaizone di winrar riesce a convertire solo pochi byte. Per adesso io volevo fare in modo tale che quando trova un caratere non valido lo ignori semplicemente. Si può fare?
    Grazie moltissime ancora

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Sprunk
    Non credo. Finchè si tratta di una sola riga va bene. Quando ci sono più righe, nel ritorno a caso mette 0A e poi prosegue sulla stessa riga.
    No ... aspetta, forse non stiamo parlando la stessa lingua.

    Non hai usato un codice come quello che hai postato all'inizio:

    while((c = fgetc(fp))!=EOF)
    fprintf(fw, "%02X", (unsigned char)c);

    per convertire un file binario in un file di testo con le coppie di hex??? Quel codice non dovrebbe mettere newline o roba strana.

    Mica stai per caso dando in input un file binario al tuo codice che usa:

    while(fscanf(pFile, "%02X", &v)!=EOF)
    ....

    ???
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  9. #9
    Dunque. Per evitare ulteriori incomprensioni, ti posto il codice completo che st; usando.
    codice:
    #include <stdio.h>
    #include <iostream.h>
    #include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    char path[100];
    int bintoascii()
    {
    //da binario ad asci
    	FILE *pFile, *fw2;
       if((pFile = fopen("C:\\A\\out.hex","rb")) == NULL) return 0; //file esadecimale
       if((fw2 = fopen("C:\\A\\out2.txt","wb")) == NULL) return 0; //file risultante normale
    
    int v;
    char c;
    unsigned char C;
    while(fscanf(pFile, "%02X", &v)!=EOF)
    {
       C = (unsigned char)v;
       fprintf(fw2, "%c", C);
    }
    		
    fclose(pFile);
    fclose(fw2);
    }
    int main()
    {
    //da ascii a binario
    	
    	
    	
    	FILE *fp, *fw;
       char c;
    
       if((fp = fopen("C:\\A\\file.exe","rb")) == NULL) return 0; //file normale
       if((fw = fopen("C:\\A\\out.hex","wb")) == NULL) return 0; //file uscente esadecimale
    
       while((c = fgetc(fp))!=EOF)
             fprintf(fw, "%02X", (unsigned char)c);
    
       fclose(fw);
       fclose(fp);
       bintoascii();
    }
    Non stò usando tutte le variabili.... la funzione da ascii a binaio presente nella main() funziona bene, però appena trova un carattere che non può convertire si ferma li. la funzioen esterna al main Funziona bene, quella non mi ha ancora dato problemi. Per adesso l'unico problema che devo risovbere èp la funzioen interna al main. devo far si che quando triova un carattere non valido lo ignora, senza bloccare la conversione. Spero di essermi spiegato bene. Ancoea grazie tante. Ciaooo

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    6
    invece di EOF confronta il numero di bites scritti e letti, altrimenti ti darà sempre errore, io ho dovuto fare così per copiare i file ( programmo su PSP quindi niente API )

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.