Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#6

AW: verschlüsseln

  Alt 12. Nov 2010, 09:37
Normalerweise trennt man die Darstellung, Ein- und Ausgabe im Formular von der fachlichen Logik.
Das dient der Übersichtlichkeit und erleichtert die Fehlersuche.
Außerdem kann man den Code so später an anderer Stelle wiederverwenden.

Delphi-Quellcode:
  Maske:=254; // damit alle Bits 1 sind außer das letzte
{...}
Eigentlich ist die eine Konstante und sollte auch als solche deklariert werden.

Delphi-Quellcode:
  f:=7; // weil man um 7 nach rechts shr
{...}
An dieser Stelle überflüssig, da die Variable immer überschrieben wird, sollte der Compiler auch melden.

Delphi-Quellcode:
len:=Length(Memo1.Text); //länge des memo
{...}
Eine wichtige Information, die du aber nicht im Bild speicherst.
Schon aus diesem Grund wird es schwierig den Text wieder aus dem Bild zu extrahieren.
Siehe in meinem Beispiel weiter oben.
Da es sich nur um reinen Text handelt, kannst du am Ende des Textes auch ein Null-Zeichen (Binär #0) speichern,
um das Ende zu markieren. Besonders schön ist das aber auch nicht.

Delphi-Quellcode:
For y:=0 to hoehe-1 do begin
{...}
Wo kommen den auf einmal "hoehe" und "breite" her?
Globale Variablen? Pfui!
Entweder du definierst lokale Variablen
Delphi-Quellcode:
hoehe := Image1.picture.Bitmap.Height;
breite := Image1.Picture.Bitmap.Width;
oder benutzt gleich diese Property.

        For x:=0 to (breite*3) do begin // an der stelle x das byte verändern <- Fehler
Die Variable x wird hier zu groß. Die Zeile besteht im Pixelformat pf24Bit aus (breite *3) Byte, da die Zählung mit 0 beginnt:
        For x:=0 to (breite*3) - 1 do begin // an der stelle x das byte verändern <- Richtig
Warum rückst du an dieser Stelle eigentlich den Code ein?

Delphi-Quellcode:
          f:=7; // damit f immer wieder null wird
          temp:=p1[x] and Maske; //p1 byte und maske um das letzte bit 0 zu setzen
          f:=f-g; // da man im nächsten byte die 2te stelle 0 setzt
          v:=v shr f; // um das erste bit des buchstaben zu bekommen
Warum nicht gleich so:
Delphi-Quellcode:
          temp:=p1[x] and Maske; //p1 byte und maske um das letzte bit 0 zu setzen
          v:=v shr (7 - g); // um das jeweilige bit des buchstaben zu bekommen
Damit entfällt f komplett.

          P1[x]:=temp or v; // um das byte mit dem letzten bit verändert wieder ins memo zu schreiben Das unterste Bit von "temp" ist 0.
Das unterste Bit von "v" enthält die zu speichernde Information (0 oder 1).
Aber die anderen Bits von v sind nicht unbedingt leer und müssen vorher ausmaskiert werden.
Delphi-Quellcode:
 Maske2 = 1;
{nur unterstes Bit in v enthält die Information, Rest vor der verknüpfung löschen}
P1[x]:=temp or (v and Maske2);
Delphi-Quellcode:
          if m>=len then // verhindert das diese schleife das ganze bild verändert
           exit; // Aktion um diese Procedure zu beenden
Fehler, da wird ein zeichen zu wenig gespeichert, da der Text von 1 bis len geht.


Hier noch ein kurzes Beispiel wie man ein zusätzliches Nullzeichen speichern kann, um das Textende zu markieren:
Delphi-Quellcode:
        For x:=0 to (breite*3) - 1 do begin // an der stelle x das byte verändern
          if m <= len then
            v:=ord(Memo1.Text[m]); // Buchstabe in Zahl und dann ins byte
          else
            v := 0;
          temp:=p1[x] and Maske; //p1 byte und maske um das letzte bit 0 zu setzen
          v:=v shr (7 - g); // um das jeweilige Bit des Buchstaben zu bekommen
          P1[x]:=temp or v; // um das byte mit dem letzten bit verändert wieder ins memo zu schreiben
          if g<7 then // damit man immer nur maximal nach 6 shiftet
            inc(g)
          else
          begin
            g:=0; // g wieder 0 setzen
            inc(m); // um neuen Buchstaben zu bekommen
          end;

          if m> (len + 1) then // verhindert das diese schleife das ganze bild verändert
           exit; // Aktion um diese Procedure zu beenden
        end; // Annmerkung hoehe und breite schon im private deklariet
  Mit Zitat antworten Zitat