hexeditor unter unix schreiben



  • hi leutz habe zur zeit prakrikum und meine aufgabe ist für ne woche das ich nen hexeditor schreiben soll....

    ein gerüst ist auch schon dar:

    #include <stdio.h>
    #include <string.h>

    void main()
    {
    char name[10]="test.txt", *pName=&name[0];
    char zeichen[2]="", *pZeichen=zeichen;
    int zaehler=0;
    char zeichene[16]="", *pZeichene=zeichene;
    int anzahl=0;

    FILE *fd;
    fd=fopen(pName, "r");
    anzahl=fread(pZeichen, 1, 1, fd);
    while (anzahl !=0 )
    {
    strncpy(pZeichene, pZeichen, 1);
    zaehler+=1;
    pZeichene=&(zeichene[zaehler]);
    anzahl=fread(pZeichen, 1, 1, fd);
    if (zaehler == 16)
    {
    printf("0000 | %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x | %s" , zeichene[0],
    zeichene[1], zeichene[2], zeichene[3], zeichene[4], zeichene[5],zeichene[6], zeichene[7],
    zeichene[8], zeichene[9], zeichene[10], zeichene[11], zeichene[12], zeichene[13],
    zeichene[14], zeichene[15], zeichene);
    }
    }
    fclose(fd);
    }

    nur das problem ist er macht nach den 16 zeichen nicht weiter....vielleicht hat ja einer schonmal sowas gemacht und kann mir helfen wäre auf jedenfall sehr gut 😃



  • Warum liest du "anzahl" aus der Datei? Der Editor macht nicht weiter, weil anzahl beim durchlauf wahrscheinlich 0 ist.

    Übrigens ist void main falsch



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • kingruedi schrieb:

    Warum liest du "anzahl" aus der Datei? Der Editor macht nicht weiter, weil anzahl beim durchlauf wahrscheinlich 0 ist.

    Übrigens ist void main falsch

    In dem Falle müsste es int main() sein, oder ?



  • cHillb3rT schrieb:

    kingruedi schrieb:

    Warum liest du "anzahl" aus der Datei? Der Editor macht nicht weiter, weil anzahl beim durchlauf wahrscheinlich 0 ist.

    Übrigens ist void main falsch

    In dem Falle müsste es int main() sein, oder ?

    🙂 🙂 bravo cHillb3rT! So ist es 👍



  • habe es ja jetzt soweit hinbekommen.

    muss nur noch die ne zeichenkonvertierung hinbekommen mit ispirn() aber das funzt net ganz.

    hier mal der code:

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>

    int main()
    {
    char name[10]="test.txt", *pName=&name[0];
    char zeichen[2]="", *pZeichen=zeichen;
    int zaehler=0;
    char zeichene[16]="", *pZeichene=zeichene;
    int anzahl=0;
    int adress=0000;
    int enof=0;

    FILE *fd;
    fd=fopen(pName, "r");

    anzahl=fread(pZeichen, 1, 1, fd);
    while (anzahl !=0 )
    {
    strncpy(pZeichene, pZeichen, 1);
    zaehler+=1;
    pZeichene=&(zeichene[zaehler]);
    if (zaehler == 16)
    {
    printf("%.4x | %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x
    %.2x %.2x %.2x %.2x | %s\n", adress, zeichene[0], zeichene[1],
    zeichene[2], zeichene[3], zeichene[4], zeichene[5],zeichene[6],
    zeichene[7], zeichene[8], zeichene[9], zeichene[10],
    zeichene[11], zeichene[12], zeichene[13], zeichene[14],
    zeichene[15], zeichene);
    zaehler=0;
    adress+=16;
    pZeichene=zeichene;
    strncpy(zeichene, " ", 16);
    }
    anzahl=fread(pZeichen, 1, 1, fd);
    }
    if (zaehler < 16 && anzahl == 0)
    {
    printf("%.4x |",adress);
    for (enof=0;enof<zaehler;enof+=1)
    {
    printf(" %.2x", zeichene[enof]);
    if (enof == 7)
    {
    printf(" ");
    }
    }
    printf(" | %s\n", zeichene); --> 😕 hier die ausgabe soll mit
    dieser überprüfung (isprint) gemacht
    werden, habe aber keinen plan
    }
    fclose(fd);
    }



  • Hallo alle zusammen,

    Was du willst is glaub ich nen HexViewer, keinen Hexeditor ; - ) ODA?

    Ich hab da mal was geschrieben, allerdings hat der Kack hier noch n paar Probleme mit Umlauten und Sonderzeichen, vielleicht liegt das aber auch an dem Zeichensatz meines Rechners. Naja, hier is mal der Code zum testen.

    #include <stdio.h>
    #include <string.h>
    
    void print_head(void)
    {
    printf("\n\t       +++++++++++++++++++++++++++++++++++++++++\n"
    	"\t       +++++++++++++++++HEX_VIEW++++++++++++++++\n"
    	"\t       +++++++++++++++++++++++++++++++++++++++++\n\n");
    }
    
    void print_usage(char *s)
    {
    printf("\t usage: hexview -f file [-d dump_file]\n\n", s);
    }
    
    int hex_view(char *file, char *dump_file)
    {
    
        FILE *f1, *f2;
        char c,row[16];
        int i=0,j=0,k=0;
    
        if ( dump_file != NULL )
        {
    	 f2=fopen(dump_file,"w");
        }
    
        f1=fopen(file,"r");
    
        if ( f1 == NULL || f2 == NULL )
        {
    	 printf("couldn´t open some files\n");   
    	 return 4;
        }
    
        while ( !feof(f1) )
        {
    
    	 fscanf(f1,"%c",&c);
    
    	 if ( c == '\n' )
    	     c = '.';
    	 else
    	     row[i++]=c;
    
    	 if ( i == 16 )
    	 {
    	     printf("0x%.8x | ", k);
    	     k+=0x10;
    
    	     for (i=0;i<16;i++)
    		  printf("%.2x ", row[i]);
    
    	     printf("| ");
    	     for (i=0;i<16;i++)
    		  printf("%c", row[i]);
    
    	     printf("\n");
    	     i=0;
    	 }
        }
    
        printf("0x%.8x | ", k+=0x10);
        for (;j<i;j++)
    	 printf("%.2x ", row[j]);
        for (;j<16;j++)
    	 printf("   ");
    
    	 printf("| ");
        for (j=0;j<i;j++)
    	 printf("%c", row[j]);
        for (;j<16;j++)
    	 printf(".");
    
        printf("\n");
    
    return 0;
    }
    
    int main(int argc, char **argv)
    {
        int i=1;
        char *file,*dump_file=NULL;
    
        print_head();
    
        if (argc < 2)
        {
    	 print_usage(argv[0]);
    	 return 1;
        }
    
        //argument check
        for (;i<argc;i++)
        {
    	 //check for file, which should be hex-viewed
    	 if ( !strcmp(argv[i],"-f") )
    	 {
    	     if ( i+1 == argc )
    	     {
    		  printf("\nmissing filename\n");
    		  return 2;
    	     }
    	     file=argv[i+1];	     
    	 }
    
    	 //check for dump_file
    	 if ( !strcmp(argv[i],"-d") )
    	 {
    	     if ( i+1 == argc )
    	     {
    		  printf("\nmissing dump_filename\n");
    		  return 3;
    	     }
    	     dump_file=argv[i+1];
    	 }    
        }
    
    return hex_view(file,dump_file);
    }
    

    Die dump_option is quatsch, man kann die Ausgabe ja auch mittels '>' umlenken.

    Wenn was falsch is oder was besser gemacht gehört, dann bitte schreiben.
    Danke schon mal!

    Tschö 😃


Anmelden zum Antworten