Binärdatei einlesen und formatieren



  • Hallo,

    ich möchte folgendes in C realisieren:
    - eine Binärdatei (genauer ein kompilierten Quellcode) byteweise einlesen
    - diese einzelnen Bytes als hex Zahlen in einer neuen Textdatei auflisten

    Das drumherum funktioniert, doch die Hauptfunktion "Quelldaten in Zieldatei schreiben" nicht.
    Deshalb schreibe ich, wie in Code Zeile 78 zu sehen, erstmal statische Werte in die Zieldatei, das funktioniert wie gewünscht.

    Wie kann ich nun aber das eingelesene Zeichen so verarbeiten, dass ich dieses statt "AB" in die Zieldatei schreiben kann?
    Alle Versuche enden in einem Fehler oder in undefinierten Symbolen in der Zieldatei.

    Danke!

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <string.h>
    #ifdef __unix__
          #include <unistd.h>
    	  #include <sys/stat.h>
          #include <sys/types.h>
    #elif __MSDOS__ || __WIN32__ || _MSC_VER
          #include <io.h>
          #include <sys\stat.h>
    #endif
    
    int main(void) {
    
    	int fh_w;
    	int fh;
    	char startpuffer[28] = {0};
    	char endpuffer[4] = {0};
    	char puffer[2] = {0};
    	char puffer_[1] = {0};
    
    	strcpy(startpuffer," \nunsigned char array[] = {\n");
    	strcpy(endpuffer," \n};");
    
    	FILE *quelle;
    	long i;
      	long bytes, start;
    
    // Zieldatei: erzeugen/öffnen und start-string schreiben
       umask(0);
       if( (fh_w = open("/media/sf_VMshare_/hexarray.txt",O_RDWR|O_CREAT|O_TRUNC,S_IRWXU)) == -1) {
          perror(NULL);
          return EXIT_FAILURE;
       }
       if((write(fh_w, &startpuffer, sizeof(startpuffer))) == -1) {
          perror("Fehler bei write");
          return EXIT_FAILURE;
       }
    
    // Quelldatei: öffnen und auslesen
       	//quelle = fopen("acs_117.bin", "r+b");
    	if( (fh = open("binärdatei.bin",O_RDONLY)) == -1) {
          perror(NULL);
          return EXIT_FAILURE;
       	}
    
    // Quelldatei: Anzahl an Bytes ermitteln
    	bytes = lseek(fh, 0, SEEK_END ); // ans Ende springen 
    	if(bytes == -1){
    		perror("Fehler lseek");
          	return;
    	}
    	bytes = bytes -1;
    	start = lseek(fh, 0, SEEK_SET ); // an den Anfang zurück
    
    	bytes = 20;
    
    // Quelldaten in Zieldatei schreiben
    	for(i = start; i <= bytes; i++){
    
    		//if(quelle != NULL){
    	  		//fread(&puffer_, sizeof(char), 1, quelle);
    
    			if( (read(fh, &puffer_, 1)) == -1) {
    				  perror("Fehler bei read");
    				  return EXIT_FAILURE;
    			}
    
    			printf("Wert %d = %x \n", i, puffer_[0]);			
    
    			strcpy(puffer, "AB");
    
    			if((write(fh_w, "0x", 2)) == -1) {
    		  		perror("Fehler bei write");
    		  		return EXIT_FAILURE;
    			}
    			if((write(fh_w, &puffer, 2)) == -1) {
    		  		perror("Fehler bei write");
    		  		return EXIT_FAILURE;
    			}
    			if(i < bytes){
    				if((write(fh_w, ",\n", 2)) == -1) {
    			  		perror("Fehler bei write");
    			  		return EXIT_FAILURE;
    				}
    			}
    
    		//}
    
    	}
    
    // Zieldatei: end-string schreiben und schließen
    	if((write(fh_w, &endpuffer, sizeof(endpuffer))) == -1) {
          perror("Fehler bei write");
          return EXIT_FAILURE;
       	}
    
       close(fh_w);
    
    }
    


  • Du kannst mit fprintf direkt in die Datei schreiben oder mit sprintf erst in einen String.

    Wenn du nur ein Zeichen lesen möchtest, ist fgetc sinnvoller als fread .

    Warum nimmst du die Posixfunktionen für die Dateioperationen?



  • - das Mischen von POSIX und Standard C Dateifunktionen ist Unsinn
    - Sonderzeichen in Dateinamen ebenso wie whietspaces ebenso
    - &array ist meistens Unsinn und bei dir sogar UB
    - wenn du zeichenweise liest, ist die Dateigrößenbestimmung vorab überflüssig (bei dir obendrein standardinkonform)
    - die Hex-Angabe "0x" überlässt man besser (s)printf, alá "%#04x"


Log in to reply