Grafikdatei laden



  • Hallo,

    ich möchte gerne von Grafikdateien den Maschinencode laden und anzeigen. Habe es mit fread probiert und das ganze in einen Memo ausgeben. Leider bekomme ich dabei nur den klar Text angezeigt. Also ist dies nicht gerade viel.

    Wie kann ich das ganze realisieren? Das ganze soll so wie beim Total Commander aussehen wenn ich dort F3 (betrachten) drücke.

    Hat jemand eine Idee?



  • Vor der Ausgabe im Memo musst du die nicht darstellbaren Zeichen (ASCII < 32) z.B. durch Leerzeichen ersetzen.



  • Hallo zusammen,

    nach einer kleinen Pause habe ich es mal geschafft das ganze Weiter zu bauen.

    Jedoch weiß ich nicht ganz wie ich das hinbekomme wie es im Lister vom Total Commander funktioniert.

    So das jedes Zeichen neben ein ander und richtig unter einander steht und das ganze eine Block ergbit. Siehe hier das Bild.

    Hoffe einer hat einen Tip von Euch.



  • die blockansicht bekommst du hin, indem du eine schriftart wählst, wo jedes zeichen gleich breit ist
    z.B.: Courier, Courier New oder Terminal
    Terminal hat den Vorteil, dass Sonderzeichen (ASCII <=32) mit angezeigt werden
    das machst die sache dann relativ einfach: nur alle zeichen in das memo laden und für jede zeile im Memo eine feste anzahl von zeichen definieren



  • Auch bei Terminal als Font müssen zumindest die Nullen ersetzt werden, da (Ansi)Strings bekanntlicherweise durch Null terminiert werden. Obwohl ein StringReplace() natürlich tatsächlich relativ einfach ist. 😉



  • Hi,

    ich bekomme das einfach nicht mit dem Memo hin. Weiß auch nicht was ich falsch mache! Kann einfach die Dateien nicht richtig darstellen.

    Siehe hier. Bei dem Bild handelt es sich um ein Beispiel Form. In Memo und RichEdit wurde ein und die Selbe Datei geladen.

    Würde auch RichEdit benutzen, jedoch schreibt RichEdit auch Richtexte. (/par...). Das will ich bei Grafikdateien leider nicht.



  • Ein Ansatz:

    TMemoryStream *mem = new TMemoryStream();
    mem->LoadFromFile(datei);
    
    char ch[2];
    for (int i = 0; i < mem->Size; i++)
    {
      mem->Read(ch, 1);
      if (ch[0] < 32)
      {
        mem->Position--;
        mem->Write("\xBF", 1); // 0xBF = 191 = '¿'
      }
    }
    mem->Position = 0;
    Memo1->Lines->LoadFromStream(mem);
    
    delete mem;
    


  • Gut, das Funktioniert. Jedoch erfüllt das nicht ganz den Zweck meines Erstrebens. Ich möchte eine Grafikdatei in Maschinencode öffnen und speichern. Vielleicht wäre hierfür ein Hex Editor gut. Doch kann mir jemand sagen wo ich dafür Sources finde?



  • Der Code macht genau das was auch die View-Funktion des TotalCommander macht. Wenn das nicht dein "Erstreben" war dann hast du dich ziemlich unverständlich ausgedrückt. 😉



  • Hi,

    da hast Du wohl recht. Wenn ich anstatt es '¿' ein Kästchen nehme kommt das ganze hin. Gibt es denn ein Objekt was eine Hex Darstellungsweise sowie hier im Code Beispiel darstellen kann?

    48 61 6C 6C 6F 20 46   Hallo F
    6F 72 75 6D 21 21 21   orum!!!
    


  • Jansen schrieb:

    Ein Ansatz:

    TMemoryStream *mem = new TMemoryStream();
    mem->LoadFromFile(datei);
    
    char ch[2];
    for (int i = 0; i < mem->Size; i++)
    {
      mem->Read(ch, 1);
      if (ch[0] < 32)
      {
        mem->Position--;
        mem->Write("\xBF", 1); // 0xBF = 191 = '¿'
      }
    }
    mem->Position = 0;
    Memo1->Lines->LoadFromStream(mem);
    
    delete mem;
    

    Das Beispiel ist gut. Jedoch sollte es nicht

    char ch[2]; // sondern
    
    unsigned char ch[2];
    

    sein. Denn ich weiß nicht warum, aber ein 'ä' wird als Wert -28 dargestellt. Somit ergibt sich das Zeichen '¿' in diesem Fall.


Anmelden zum Antworten