File --> Binary --> File



  • 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*.



  • the_alien schrieb:

    typedef BYTE char
    

    (Ähm, war das richtig rum?)

    nein, geht nicht.

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

    geht auch nicht..ergebnis ist das gleiche, also keine ausgabe was ich aber
    auch nich anders erwartet hatte ._."



  • geht auch nicht..ergebnis ist das gleiche, also keine ausgabe was ich aber
    auch nich anders erwartet hatte ._."

    Dir ist aber schon klar dass man die Exe nicht aus der IDE (also z.B VC++) sondern direkt aufrufen sollte? Auf jedenfall wird die myfile.txt erstellt, drinen ist die "übersetzung". Es wird bei diesem kleinen Schnippsel nicht überprüft ob die Dateien existieren, deshalb könnte so ein Aufruf in der IDE auch Fehlerhaft sein. Noch mehr vorkauen macht imho keinen Sinn, dann solltest du eine Sprache nehmen die du besser beherrschst oder eben C++ lernen.
    Ich poste übrgens keine Sachen die ich nicht getestet habe 🙄 also nehm ich mal an dass es entweder ein Compiler oder Bedienproblem ist. Außderem:

    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 Ausgangsdate

    Für Visual Basic kenne ich den Code, aber bei C++ wirds halt schwer,

    wo ist also das Problem? Wenn immer noch Bedarf besteht kann ich eine 100% funktionierende Lösung in Sprache meiner Wahl schreiben (leider wird es MASM sein, so dass Du mit dem Quelltext noch weniger anfangen kannst 😉 ).



  • Ich frag mich immernoch, was das ganze bringt...


Anmelden zum Antworten