File --> Binary --> File



  • Hi,
    ich würde gerne mal wissen, ob es möglich ist
    mittels C++ (oder einer anderen sprache?)
    beliebige Dateien in ihren Binär-Code zu zerlegen
    und anschließend wieder zurück in die Ausgangsdatei.

    Habe bis jetzt nirgends im Netz etwas dazu gefunden,
    nur dass es mit Text geht....was ja recht einfach ist,
    aber es geht mir vor allem um *.jpg oder andere Dateitypen.

    Vielen Dank schon mal im Vorraus!



  • Ja.
    Geht mit so ziemlich jeder Sprache.



  • was passiert wenn du das jpg wie ein txt-file behandelst?

    tom



  • the_alien schrieb:

    Ja.
    Geht mit so ziemlich jeder Sprache.

    Und mit welcher funktion geht das?
    Beispiel? Vorhandene Programme zum Umwandeln vorhanden?



  • Programme zum Umwandeln?
    Im Prinzip ist alles auf dem Bildschirm binär... Es kommt nur auf die Interpretation des ganzen an.

    Du kannst jede Datei in einem HexEdito öffnen und den Hexadezimalcode angucken.
    Die Beziehung zwischen Hexadezimal und binär kennst du hoffentlich.

    Funktion? Es kommt drauf an wie du die Datei öffnest und wie du mit den ausgelesenen Daten umgehst.
    Du kannst jedes Zeichen ins Binär-Format bringen. Du musst es nur umrechnen.

    Ich versteh die Frage nicht so ganz. Was ist der Hintergrund?



  • the_alien schrieb:

    Programme zum Umwandeln?
    Im Prinzip ist alles auf dem Bildschirm binär... Es kommt nur auf die Interpretation des ganzen an.

    Du kannst jede Datei in einem HexEdito öffnen und den Hexadezimalcode angucken.
    Die Beziehung zwischen Hexadezimal und binär kennst du hoffentlich.

    Funktion? Es kommt drauf an wie du die Datei öffnest und wie du mit den ausgelesenen Daten umgehst.
    Du kannst jedes Zeichen ins Binär-Format bringen. Du musst es nur umrechnen.

    Ich versteh die Frage nicht so ganz. Was ist der Hintergrund?

    Hexadezimal nützen sie mir aber leider nichts.
    Ich will ein Programm schreiben, dass mir jede beliebige Datei in ihren
    Binärcode zerlegen kann ... also in Maschinensprache aus 0 und 1 und umgekehr
    aus den Nullen und Einsen wieder eine ausführbare Datei (Bilder usw).

    Dafür bräuchte ich eine Funktion, die eine Datei einliest, sie in Maschinensprache
    in eine andere Datei (Textfile) reinschreibt und bei bedarf wieder in
    ihren ursprünglichen Typen zurückwandeln kann.

    Bild --> Textdatei mit 0 und 1 --> Bild



  • char tmp;
    char mask;
    do
    {
      mask = 1;
      fin >> tmp;
      for(int i = 7; i >= 0; i--)
      {
        if( tmp & (mask << i) )
          cout << 1;
        else
          cout << 0;
      }
    }while(!fin.eof());
    

    fuer big-endian maschinen "mask >> i"
    edit: Ausgabe in falscher Reihenfolge => korrigiert



  • Kyuzo schrieb:

    Ich will ein Programm schreiben, dass mir jede beliebige Datei in ihren Binärcode zerlegen kann ... also in Maschinensprache aus 0 und 1 und umgekehr
    aus den Nullen und Einsen wieder eine ausführbare Datei (Bilder usw).

    1. Maschinensprache != Binärcode
    2. Bild != ausführbare Datei
    3. FF == 11111111

    Kyuzo schrieb:

    Dafür bräuchte ich eine Funktion, die eine Datei einliest, sie in Maschinensprache
    in eine andere Datei (Textfile) reinschreibt und bei bedarf wieder in
    ihren ursprünglichen Typen zurückwandeln kann.

    Bild --> Textdatei mit 0 und 1 --> Bild

    Lies dieses



  • @pli: schön, aber es geht leider nicht.
    @the_alien: die seite bringt mir nichts.

    Anscheinend versteht ihr nich was ich meine.
    Ich brauche ein Programm, dass eine beliebige Datei
    in Nullen und Einsen umrechnet, in eine neue Datei
    speichert und das ganze auch umgedreht kann.

    Bei Text und Zahlen ist das ja kein problem, aber
    EXE-Dateien lassen sich ja nicht so einfach auslesen
    und buchstabenweise umwandeln...sonderzeichen und blah ._."
    hexeditor nützt mir auch nichts, weil ichs ja in 0 une 1
    haben will und nicht in zahlen+buchstabenkombination.



  • plis Beispiel funktioniert sogar sehr gut.
    Und es macht genau das, was du brauchst.



  • ja und wie kann ich dann damit die datei einlesen bzw die neue schreiben?

    ich kann mit dem snippet nicht viel anfangen leider.

    bei mir sieht der quelltext jetzt so aus, aber er gibt mir die falschen werte aus.

    #include <iostream.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <fstream>
    
    int main ()
    {
    ifstream fin;
     fin.open("c:\\flow.txt");
    
    char tmp;
    char mask;
    
    do
    {
      mask = 1;
      fin >> tmp;
      for(int i = 7; i >= 0; i--)
      {
        if( tmp & (mask << i) )
          cout << 1;
        else
          cout << 0;
      }
    }while(!fin.eof());
    
      return 0;
    }
    


  • Bei mir sieht der Quelltext genauso aus und die Werte sind richtig...
    Datei einlesen tust du schon... Lies den Text den ich weiter oben gepostet habe.

    Sicher, dass die Werte falsch sind?
    Wenn ja, bei welchen Werten? (Vergleich die Ausgabe mit nem HexEditor mit der Datei)



  • yep.
    Als Grundlage nehme ich die Flow.txt und die enthält als inhalt nur die Zahl 3.

    Ausgabe sieht dann beim aufrufen folgender maßen aus:

    0011001100110011

    ...kann ja nicht stimmen, weil die 3 als binärwert nur 00000011 hat.

    0011001100110011
    00000011

    die letzten beiden zahlen stimmen, das weiß ich auch von anderen zahlen her,
    aber derrest ist völliger mist der ausgegeben wird.

    außerdem wird die länge immer größer je mehr stellen die zahl hat ... bei 128 sinds schon 3 mal soviel wie es sein müssten.



  • #include <fstream>
    #include <iostream>
    
    using namespace std;
    
    void binaryToText(char *source, char *target, bool printToScreen);
    void textToBinary(char *source, char *target);
    
    int main ()
    {
      binaryToText( "myfile.exe", "myfile.txt", false );
      textToBinary( "myfile.txt", "mynewfile.exe" );
      return 0;
    }
    void binaryToText(char *source, char *target, bool printToScreen)
    {
      ifstream fin(source);
      ofstream fout(target);
      char mask, tmp;
      do
      {
        mask = 1;
        fin >> tmp;
        for(int i = 7; i >= 0; i--)
        {
          if( tmp & (mask << i) )
          {
            fout << 1;
            if(printToScreen) cout << 1;
          }
          else
          { 
            fout << 0;
            if(printToScreen) cout << 0;
          }
        }
      }while(!fin.eof());
      fin.close();
      fout.close();
    }
    void textToBinary(char *source, char *target)
    {
      ifstream fin(source);
      ofstream fout(target);
      char tmp, out, mask;
      do
      {
        mask = 1;
        out = 0;
        for(int i = 7; i >= 0; i--)
        {
          fin >> tmp;
          if( tmp == '1' )
          {
             out |= (mask << i);                 
          }
          else if ( tmp == '0' )
          { 
            //nothing to do here, the 0 is set
          }
          else
          {
            cout << "What is that: '" << tmp << "'?\n";
            return;
          }
        }
        fout << out;
      }while(!fin.eof());
    }
    

    Edit: Tippfehler



  • Es steht aber eine 3 in der Textdatei als ASCII Code, ASCII Code für 3 ist der Wert 51 was binär
    110011 entspricht. Wenn man das auf Deine Ausgabe bezieht, wird hier der Asciicode 3 2mal ausgegeben...

    aber derrest ist völliger mist der ausgegeben wird.

    außerdem wird die länge immer größer je mehr stellen die zahl hat ... bei 128 sinds schon 3 mal soviel wie es sein müssten.

    Bei Text und Zahlen ist das ja kein problem, aber
    EXE-Dateien lassen sich ja nicht so einfach auslesen
    und buchstabenweise umwandeln...sonderzeichen und blah

    ich glaube Du solltest etwas mehr lesen und lernen bevor Du aus einer Laune heraus etwas versuchst und dabei auch noch den völlig richtigen Quelltext den einer freundlicherweise geschrieben hat als falsch quittierst.
    128 in einer Textdatei wird als ASCII Zeichen abgespeichert, intern sind das 3 Bytes dargestellt: 49 50 56 (oder lieber hex: 31 32 38 )
    möchte man 128 als Wert in einer Datei speichern, dann macht man das mit einem Programm welches das erlaubt: beispielsweise einem HEX-Editor.

    Ob eine Datei Ausführbar ist oder nur Text enhält ist dabei komplett egal!



  • ja ok, das mit dem ASCII Code hätte ich bei genauer überlegung auch
    herauskriegen können/müssen.
    dass es aber 2 mal das selbe war wusste ich auch, hatte aber keine
    ahnung warum sich die asugabe immer weiter verlängert je größer die
    Zahl wurde.

    als falsch habe ich den quelltext nicht betrachtet, jedoch als unvollständig,
    zumal er auch jetzt wie er oben komplett gepostet wurde (vielen dank auch
    nochmal dafür 😉 ) leider auch noch nicht ganz astrein ist.
    Er übersetzt großteile wunderbar, aber Leerzeichen werden weggekürzt beim
    zurückwandeln in eine exe.

    aus einer test-exe 2,1MB wurde ein txt-file von 32 kb und daraus wieder eine
    exe-datei mit 3 kb ... schon etwas seltsam.



  • ich kann zwar kein C++ aber den Quelltext von pli habe ich angepasst so dass es "läuft":

    #include <fstream>
    #include <iostream>
    
    using namespace std;
    
    void binaryToText(char *source, char *target, bool printToScreen);
    void textToBinary(char *source, char *target);
    
    int main ()
    {
      binaryToText( "myfile.exe", "myfile.txt", false );
      textToBinary( "myfile.txt", "mynewfile.exe" );
      return 0;
    }
    void binaryToText(char *source, char *target, bool printToScreen)
    {
      ifstream fin(source,ios::binary);
      ofstream fout(target);
      char mask, tmp;
    
      fin.read(&tmp,1);
      while(!fin.eof())
      {
        mask = 1;
    
        for(int i = 7; i >= 0; i--)
        {
          if( tmp & (mask << i) )
          {
            fout << 1;
            if(printToScreen) cout << 1;
          }
          else
          {
            fout << 0;
            if(printToScreen) cout << 0;
          }
        }
    	 fin.read(&tmp,1);
      }
      fin.close();
      fout.close();
    }
    void textToBinary(char *source, char *target)
    {
    	ifstream fin(source);
    	ofstream fout(target,ios::binary);
      char tmp, out, mask;
      while(!fin.eof())
      {
        mask = 1;
        out = 0;
        for(int i = 7; i >= 0; i--)
        {
          fin >> tmp;
          if( tmp == '1' )
          {
             out |= (mask << i);                
          }
          else if ( tmp == '0' )
          {
            //nothing to do here, the 0 is set
          }
          else
          {
            cout << "What is that: '" << tmp << "'?\n";
            return;
          }
        }
        if(!fin.eof()) fout << out;
      }
     fin.close();
     fout.close();
    }
    

    natürlich kann man das besser machen... vor allem schneller (die "if(fin.eof()" gehört ersetzt! ist imho Bremse nummer eins, bremse nummer zwei sind die fin.eof in der Whilebedienung 😉 ). Zuallererst in dem man das ganze in eine For schleife packt (vorher die Dateigröße ermitteln). Dabei statt per stream zeichen für Zeichen einzeln zu lesen lieber in Blöcken (ok, k.A wie das vernünftige Compiler machen, hab nur einen VC++ 6.0, kann mir natürlich vorstellen dass ein normaler Compiler es etwas "besser" optimiert)

    Und die größte Optimierung: muss es denn sein mit dem Umwandeln in ASCII und zurück? man kann es sich doch nur anzeigen lassen und zwar sogar mit schöner Formatierung ala: 01110000 01110001 usw.

    Ansonsten: da gibts zwar noch einiges zu optimieren, aber im Prinzip funktionierts ja. Habe es mit 1-2 MB Exen getestet.

    PS: irgendwie eklig, einen Byte als Char anzusprechen, aber wer es mag 😉



  • Coole sache CDW, aber jetzt gibts gleich gar keine ausgabe mehr. >_>
    Für Visual Basic kenne ich den Code, aber bei C++ wirds halt schwer,
    da ich mich damit noch nicht so gut auskenne.

    btw: der text soll so unformatiert bleiben 😉



  • CDW schrieb:

    PS: irgendwie eklig, einen Byte als Char anzusprechen, aber wer es mag

    typedef BYTE char
    

    (Ähm, war das richtig rum?)

    @Kyuzo
    Übergib binaryToText ein true statt einem false und es gibt auch ne ausgabe.



  • Coole sache CDW, aber jetzt gibts gleich gar keine ausgabe mehr. >_>

    wird doch alles in der myfile.txt gespeichert 😉 oder wie erwähnt Binarytotext (xx,xx, true) aufrufen.

    Für Visual Basic kenne ich den Code

    Gibts denn in VB Bitoperatoren/manipulationen? Das würde VB in meinen Augen schon gehörig aufwerten 😉

    PS:Ich bleibe trotzdem lieber bei meinem Müsli ((Object)Pascal 🕶 ) *mich vor dem wütendem C++ Mob hinter meinen FP/TP-Compilern verschanz*.


Log in to reply