Announcement

Collapse
No announcement yet.

Umwandlungs Probleme mit Move

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Umwandlungs Probleme mit Move

    Hallo,<p>
    habe folgendes Problem:<br>
    möchte gerne eine String 'MOF' (was ein Password darstelt)<br>
    decodieren. Die Logik Erstes Zeichen (M) um 1 nach links ver-<br>
    schieben also wird aus 'M' -> 'L' und Zeite um 2 und so weiter..<br>
    Das Password ist also 'LMC'. Nun habe ich mir da eine Procedure<br>
    geschrieben. Aber ich erhalte immer wieder Schutzverletzungen..<br>
    lasse ich halt move weg geht alles...(bis auf password auswertung)<br>
    habe aber keine Idee.<p>
    <PRE>
    procedure TFormHaupt.B_LoginClick(Sender: TObject);
    var b: Array of Byte;
    i,c: Integer;
    s: String;
    begin
    if E_Name.Text = '' then exit;
    A_T_LoginUser.First;
    while not A_T_LoginUser.Eof do
    if A_T_LoginUser.Fields[0].AsString = E_Name.Text then
    begin
    s := Trim(A_T_LoginUser.Fields[2].AsString);
    c := Length(s);
    Move( s, b, SizeOf(s));
    for i := 0 to c-1 do b[i] := b[i] - i - 1;
    Move( b, s, SizeOf(b));
    if s = E_Pass.Text then P_Login.Visible := False;
    Break;
    end else A_T_LoginUser.Next;
    if not P_Login.Visible then
    begin
    SpeedButton1.Enabled := True;
    Logout1.Enabled := True;
    Application.CreateForm(TDM, DM);
    end;
    end;
    </PRE><p>
    hendrik leesch

  • #2
    Also, die Routine Decode sollte deinen Algorithmus wiederspiegeln:
    <pre class="sourcecode"><code>
    <b>program</b> Project1;
    <font color="#003399"><i>{$APPTYPE CONSOLE}</i></font>
    <b>uses</b> sysutils;
    <br>
    <b>function</b> Decode(<b>const</b> s: <b>string</b>): <b>string</b>;
    <b>var</b>
    i: Integer;
    <b>begin</b>
    Result := s;
    <b>for</b> i := 1 <b>to</b> Length(Result) <b>do</b>
    Dec(Result[i], i);
    <b>end</b>;
    <br>
    <b>begin</b>
    Writeln(Decode(<font color="#9933CC">'MOF'</font>));
    Readln;
    <b>end</b>.

    </code></pre>

    Allerdings kann es Probleme geben, wenn der String "zu lang" ist. Irgendwann ist dann nämlich der Index eines Zeichens größer als sein Bytewert, und du kriegst negative ASCII-Werte, was vermutlich in einem Bereichsprüfungsfehler endet.
    <p>Besonders sicher dürfte deine Verschlüsselung eh nicht sein. Dazu kann dir Hagen Reddmann aber mehr sagen. :-)
    <p>Ach ja: Das Problem in deinem Codefragment ist, das du das <b>dynamische</b> Array b und den AnsiString s wie ein statisches Array bzw. eine ShortString behandelst: Zum einen fehlt die Initialisierung von b:<pre>
    SetLength(b, c);
    </pre>und zum anderen musst du deine Move's umformulieren:<pre>
    Move(s[1], b[0], c);
    </pre>
    Die Variablen s und b sind nämlich in Wirklichkeit nur Zeiger auf dynamisch allozierte Speicherbereiche, und dein Move(s, b, SizeOf(s)) kopiert nur die Zeiger!
    <p>Ciao, Uli

    Comment

    Working...
    X