Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Probleme mit Byte (nach Konvertierung D2007 zu D2009)
AScomp - Do 11.12.08 14:24
Titel: Probleme mit Byte (nach Konvertierung D2007 zu D2009)
Hallo zusammen,
nachfolgende Funktion möchte ich unter Delphi 2009 kompilieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77:
| function PassphraseQuality(const Password: String): Extended; function Entropy(P: PByteArray; L: Integer): Extended; var Freq: Extended; I: Integer; Accu: array[Byte] of LongWord; begin Result := 0.0; if L <= 0 then Exit; FillChar(Accu, SizeOf(Accu), 0); for I := 0 to L-1 do Inc(Accu[P[I]]); for I := 0 to 255 do begin if Accu[I] <> 0 then begin Freq := Accu[I] / L; Result := Result - Freq * (Ln(Freq) / Ln(2)); end; end; end;
function Differency: Extended; var S: String; L,I: Integer; begin Result := 0.0; L := Length(Password); if L <= 1 then Exit; SetLength(S, L-1); for I := 2 to L do Byte(S[I-1]) := Byte(Password[I-1]) - Byte(Password[I]); Result := Entropy(Pointer(S), Length(S)); end;
function KeyDiff: Extended; const Table = '^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=?`QWERTZUIOPÜ*ASDFGHJKLÖÄ''>YXCVBNM;:_'; var S: String; L,I,J: Integer; begin Result := 0.0; L := Length(Password); if L <= 1 then Exit; S := Password; UniqueString(S); for I := 1 to L do begin J := Pos(S[I], Table); if J > 0 then S[I] := Char(J); end; for I := 2 to L do Byte(S[I-1]) := Byte(S[I-1]) - Byte(S[I]); Result := Entropy(Pointer(S), L-1); end;
const GoodLength = 10.0; var L: Extended; begin Result := Entropy(Pointer(Password), Length(Password)); if Result <> 0 then begin Result := Result * (Ln(Length(Password)) / Ln(GoodLength)); L := KeyDiff + Differency; if L <> 0 then L := L / 64; Result := Result * L; if Result < 0 then Result := -Result; if Result > 1 then Result := 1; end; end; |
Probleme hierbei machen die Zeilen
Byte(S[I-1]) := Byte(Password[I-1]) - Byte(Password[I]);
und
Byte(S[I-1]) := Byte(S[I-1]) - Byte(S[I]);
in den Funktionen Differency und KeyDiff.
Compiler-Meldung:
[DCC Fehler] UnitMain.pas(827): E2064 Der linken Seite kann nichts zugewiesen werden
Hat mir jemand einen Tipp, wie man das jetzt in Delphi 2009 zum Laufen bekommt?
Danke schonmal!
Viele Grüße,
Andy
Delete - Do 11.12.08 14:28
Evtl. genügt es bereits, wenn Du alle Strings als AnsiStrings deklarierst. Leider habe ich kein D2009, um das auszuprobieren.
AScomp - Do 11.12.08 14:36
Das würde zwar schon helfen, bringt mir aber nichts - ich möchte schon Unicode unterstützen.
Hat sonst noch jemand einen Tipp?
Delete - Do 11.12.08 14:37
Ord() wird bei Unicode vermutlich auch nicht gehen, oder?
AScomp - Do 11.12.08 14:40
Nein, dasselbe Problem leider.
jaenicke - Do 11.12.08 14:58
Wenn du Unicode unterstützen willst, dann wirst du das mehr oder weniger neu schreiben müssen. Jedes Zeichen ist eben nicht vom Typ Byte und auch nicht als solches behandelbar. Es ist vom Typ Char und der hat 2 Byte. Dementsprechend musst du das dann ändern.
Manina - Do 11.12.08 15:11
evtl. stört ja nur das casting ?
Geht denn sowas unter D2009 ?
Delphi-Quelltext
1:
| s[i-1] := Char(Byte(s[i-1]) - Byte(s[i])); |
AScomp - Do 11.12.08 15:26
Nein, das ist leider auch nicht möglich.
Egal, ich nutze es erst mal doch nur als Ansi-Version. Trotzdem danke für eure Tipps!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!