Hex-Konverter



  • ich Habe schwerigkeiten um das zu loesen. Ich wollte aus einer TEXT datei Hex-Code auslesen und ihm Zeilenweise am Bildschirm ausgeben. Aber er gibt mir nichts zurueck . Kann mir jemand helfen?

    Hier ist der Code:

    #include <stdio.h>

    int main(void)
    {
    FILE * pFile;

    char string [1024];

    pFile = fopen ("hex.txt" , "r");

    if (pFile == NULL) perror ("Error opening file");

    while(fgets (string, sizeof(string), pFile) != 0 )
    {
    fputs(string,pFile);
    }

    fclose(pFile);

    return 0;
    }



  • Hilft es dir evtl. wenn ich dir sage, dass du die Ausgabe in die Datei machst? *ggg*

    Achja: Wenn du schon perror() benutzt, dann solltest du auch dafür sorgen, dass niemand den FILE* danach anfasst.

    Edit: Und bitte [cpp]-Tags benutzen. Macht das ganze _wesentlich_ lesbarer.



  • Hi!

    Was willst du genau? Einen Hexdump einer Datei erstellen?
    Habs nichso ganz verstanden deine Ausführung! 🙂

    Hier mal ein (sehr) simples Beispiel um einen Hexdump einer Datei auszugeben:

    #include <stdio.h>
    #include <conio.h>
    
    typedef unsigned char byte;
    typedef unsigned long dword;
    
    bool isPrintable( int c )
    {
    	return ( c >= 0x21 && c <= 0x7E );
    }
    
    int main( int argc, char **argv )
    {
    	FILE *f = fopen( "Bild.bmp", "rb" );
    
    	if ( !f )
    		return 1;
    
    	byte buffer[ 16 ];
    	dword i = 0;
    
    	while ( !feof( f ) )
    	{
    		fread( buffer, 16, 1, f );
    
    		for ( i = 0; i < 16; i++ )
    		{
    			printf( "%02X ", buffer[ i ] );
    		}
    
    		for ( i = 0; i < 16; i++ )
    		{
    			isPrintable( ( int )buffer[ i ] ) ? printf( "%c", buffer[ i ] ) : printf( "." );
    		}
    
    		printf( "\n" );
    	}
    
    	fclose( f );
    	_getch();
    
    	return 0;
    }
    

    grüße



  • Sollte man nicht lieber im Standard definierte, portable Funktionen verwenden, anstatt sie neu und unportabel zu schreiben? (isPrintable())
    Und C89 kennt kein bool in der Form. Bei C99 brauchts dann <stdbool.h>.
    Und warum zum Henker _getch()? -> getchar()



  • Hi!

    Hast ja recht, aber als Demo reichts völlig.

    grüße



  • Nettes Thema,

    hab ich gestern erst gemacht 🙂

    Aber wenn wir schon dabei sind, ich hab sowas ähnliches geschrieben, allerdings leite ich den HEX Code in eine neues Datei.

    Klappt auch wunderbar nur wenn ich die Quelldatei mit denm Hex Editor öffne, dann bekomm ich ja ja auch Zeilennummern angezeigt, sowas in der Form:

    11 4d 5a ...
    22 80 00 ...
    33 00 00 ...

    Wobei 11,22,33,usw die Zeilennummern sind.
    Wie bkomm ich die ebenfalls ausgelesen und vor die jeweilge Zeile in die Ausgabe gesetzt ?
    Will praktisch ein exe2bat Programm machen.
    Also den Hex Code einer Datei in eine Bat schreiben, die wiederum bei Ausführung die Quellexe erzeugt.

    Thx



  • Hi!

    Zeilennummern? Das ist eigentlich der jeweilige Offset der Zeile in der Datei. Den kannst du einfach mitzählen, wenn du pro Zeile 16 Bytes darstellst dann inkrementierst du deine Nummerierung pro Zeile um 16.

    printf( "%08X ", line );
    line += 16;
    

    grüße



  • Kannst du mir das etwas genauer erklären ?



  • Hi!

    So kompliziert isses doch ned:

    while ( !feof( f ) ) 
    	{ 
    		fread( buffer, 16, 1, f ); 
    
    		printf( "%08X ", line );
    		line += 16;
    
    		for ( i = 0; i < 16; i += 2 ) 
    		{ 
    			printf( "%02X%02X ", buffer[ i ], buffer[ i+1 ] ); 
    		} 
    
    		for ( i = 0; i < 16; i++ ) 
    		{ 
    			isPrintable( ( int )buffer[ i ] ) ? printf( "%c", buffer[ i ] ) : printf( "." ); 
    		} 
    
    		printf( "\n" ); 
    	}
    

    grüße



  • Wie deklarierst du line ? Als normales char line[16] ?



  • Hi!

    Der Typ ist unsigned long. 🙂 Einfach eine Durchnummerierung der Byteoffsets für den jeweiligen Zeilenanfang...

    grüße



  • Ok, habs.

    Das ist jetzt meine Ausgabe:

    7C91D592 4D 5A 80 00 01 00 00 00 04 00 00 00 FF FF 00 00
    7C91D5A2 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00

    Allerdings sieht der Offset nicht aus wie der den Ich vom HexEditor kenne.

    7C91D592 sollte ja 11 oder sowas sein.

    Hab ne bat die eine andere exe wiederherstellt und da sieht die erste zeile folgendermaßen aus:

    echo e 0100 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00>>1

    echi is klar. Aber das e ? und der Offset sieht auch anders aus.

    Sorry, aber sonst noch nie was mit Hex am Hut gehabt.



  • Hi!

    Wenn du dir die Mühe machst und deine Variable line mit 0 initialisierst... Das hat nichts mit "hex" zu tuen, was ist überhaupt Hex? 🙂
    Und außerdem sollte das erste Offset nicht 11 sein sondern 0 und das zweite 10, da du immer 16 Bytes pro Zeile hast. Und was ist 0+16??? 0x10, genau!

    grüße



  • Sorry. *Kopf gegen Tisch schlägt* 🙄

    Alles klar. Das war mein Fehler. Jetzt passt die Ausgabe.

    1000 Dank.



  • Ich will den Text aus einer Datei lesen und dann den Text als Binaer und ASCII Code ausgeben. Der Text sieht folgend aus:

    :10010000214601360121470136007EFE09D2190140
    :100110002146017EB7C20001FF5F16002148011988

    und so weiter.



  • noch eine frage,

    wie kann ich auf den Code zugreifen,

    : 10 0100 00 214601360121470136007EFE09D21901 40

    DIE ERSTE 8 ZAHLEN INTERESIEREN MICH NICHT UND DIE LETZTEN 2 AUCH NICHT.
    Wie kann ich nur die "DATEN" zugreifen.



  • Hat jemand schonmal ein exe2bat Programm geschrieben ?

    Ich bekomms nämlich nich hin.

    Der Hex Code der Quell-Exe wird inklusive Offset erfolgreich in eine Datei geschrieben.
    Nur wie macht man aus der anderen Datei jetzt wieder eine exe ?

    Oder hab ich da das prinzip nicht verstanden ? Bin für jede Kritik und Vorschläge offen.



  • helvin schrieb:

    noch eine frage,

    wie kann ich auf den Code zugreifen,

    : 10 0100 00 214601360121470136007EFE09D21901 40

    DIE ERSTE 8 ZAHLEN INTERESIEREN MICH NICHT UND DIE LETZTEN 2 AUCH NICHT.
    Wie kann ich nur die "DATEN" zugreifen.

    @ helvin

    In dem du die Datei zeilenweise ausliest und jede
    Zeile ab der 13. Position (Leerzeichen und was du nicht am Anfang brauchst überspringen)
    bis zum Zeilenende minus 3 ausguibst.



  • Hi!

    @Rubber:
    Ne du hast es nicht verstanden... Du darfst natürlich nur die richtigen Daten in die Datei zurückschreiben, ohne Offset. Wenn du deine hexadezimale Darstellung verwendest musst du die einzelnen Blöcke (jeweils zwei Ziffern im Normalfall) in den entsprechenden Bytewert umwandeln.
    Das speicherst du dann in deine Binärdatei.

    grüße



  • Ok, dann erklär es mir.

    #include <stdio.h>
    
    typedef unsigned char byte;
    typedef unsigned long dword;
    
    int main( int argc, char **argv )
    {
        FILE *f = fopen( argv[1], "rb" );
    	if ( !f )
    	{
    		printf("Quelldatei \"%s\" nicht gefunden !!\n", argv[1]);
                    return 1;
    	}
    
    	char batname[strlen(argv[1]) + 4];
    	strcpy(batname,argv[1]);
    	strcat(batname,"copy.exe");
    
    	FILE *o = fopen( batname, "w+" );
    	if ( !o )
    	{
    		printf("Zieldatei \"%s\" konnte nicht erstellt werden !!\n", batname);
    		return 1;
    	}
    
        byte buffer[ 16 ];
    	dword line = 0;
        dword i = 0;
    
        while ( !feof( f ) )
        {
            fread( buffer, 16, 1, f );
    
    	    char hex_string[12] = "";
    
            line += 16;
    
            for ( i = 0; i < 16; i += 2 )
            {
    		     hex_string[0] = '\0';
    		     sprintf(hex_string," %02X %02X", buffer[ i ], buffer[ i+1 ] );
    		     fputs(hex_string,o);
    	    } 
    
    	  fputs("\r\n",o);
        }
    
        fclose( f );
        fclose( o );
    
        return 0;
    }
    

    Das wurde jetzt den Hex Code in deine Zieldatei schreiben.

    Wenn du deine hexadezimale Darstellung verwendest musst du die einzelnen Blöcke (jeweils zwei Ziffern im Normalfall) in den entsprechenden Bytewert umwandeln.

    Wie mach ich das ? 😕



  • Hi!

    Ja, du hast jetzt die Daten als Hexadezimale Werte (im ASCII Format) in deine Datei geschrieben. Wenn du daraus wieder eine Binärdatei erzeugen willst musst die die einzelnen Bytes (ASCII->Hexadezimale Darstellung) wieder in die korrekten Bytewerte umwandeln.
    Diese speicherst du dann in deine Binärdatei und schon hast du die Originaldaten wieder!

    grüße


Anmelden zum Antworten