![]() |
RCx.pas unter Delphi2009 anderes Ergebnis als unter Delphi7
Hi,
ich schau mir gerade Delphi2009 mal an und habe auch gleich nen Problem mit einem Delphi7-Programm. Ich nutze die RCx.pas von Hagen und die liefert mir, wenn ich mein Programm unter D2009 kompiliere andere Ergebnisse als unter D7 kompiliert.
Delphi-Quellcode:
Wo liegt das Problem? Hat sich zwischen D7 und D2009 in dem Bereich was geaendert? Was muss ich in D2009 anderes programmieren?
{
Copyright: 2002 Hagen Reddmann Author: Hagen Reddmann, HaReddmann bei T-Online punkt de Remarks: All rights reserved Version: open source, developed on D5 Description: derivate of RC5 stream cipher with internal cipher feedback and stronger keysetup includes secure one way pseudo random number generator } unit RCx; {$A+,B-,C-,D-,E-,F-,G+,H+,I-,J+,K-,L-,M-,N+,O+,P+,Q-,R-,S-,T-,U+,V+,W-,X+,Y-,Z1} interface type TRCxContext = record D: array[Byte] of Byte; I,J,F: Byte; end; procedure RCxInit(var RCx: TRCxContext; const Key; KeySize: Integer); overload; procedure RCxInit(var RCx: TRCxContext; const Key: String); overload; procedure RCxEncode(var RCx: TRCxContext; const Source; var Dest; Count: Integer); overload; function RCxEncode(var RCx: TRCxContext; const Value: String): String; overload; procedure RCxDecode(var RCx: TRCxContext; const Source; var Dest; Count: Integer); overload; function RCxDecode(var RCx: TRCxContext; const Value: String): String; overload; procedure RCxDone(var RCx: TRCxContext); overload; // all in one encode/decode function RCxEncode(const Value, Password: String): String; overload; function RCxDecode(const Value, Password: String): String; overload; // random number generator based on RCx procedure RCxSeed(const Seed; SeedSize: Integer); overload; procedure RCxSeed(const Seed: String); overload; procedure RCxRandomize; overload; function RCxRandom(Range: Cardinal = 0): Cardinal; overload; function RCxRandomString(Length: Integer): String; overload; implementation uses Windows; type PByteArray = ^TByteArray; TByteArray = array[0..MaxInt -1] of Byte; procedure RCxInit(var RCx: TRCxContext; const Key; KeySize: Integer); var R,S,T,K: Byte; L: Integer; M: array[Byte] of Byte; begin with RCx do try L := 0; for S := 0 to 255 do begin D[S] := S; M[S] := TByteArray(Key)[S mod KeySize] xor L; L := (L + M[S] * 257) mod MaxInt +1; end; I := 0; J := 0; R := L; F := L shr 8; for S := 0 to 255 do begin Inc(R, D[S] + M[S]); T := D[S]; D[S] := D[R]; D[R] := T; end; finally R := 0; S := 0; T := 0; L := 0; FillChar(M, SizeOf(M), 0); end; end; procedure RCxInit(var RCx: TRCxContext; const Key: String); begin RCxInit(RCx, Pointer(Key)^, Length(Key)); end; procedure RCxDone(var RCx: TRCxContext); begin FillChar(RCx, SizeOf(RCx), 0); end; procedure RCxEncode(var RCx: TRCxContext; const Source; var Dest; Count: Integer); var S: TByteArray absolute Source; O: TByteArray absolute Dest; C: Integer; T,K: Byte; begin with RCx do for C := 0 to Count -1 do begin Inc(I); T := D[I]; Inc(J, T); D[I] := D[J] xor F; D[J] := T - F; Inc(T, D[I]); K := S[C]; O[C] := K xor D[T]; F := F xor K; end; end; procedure RCxDecode(var RCx: TRCxContext; const Source; var Dest; Count: Integer); var S: TByteArray absolute Source; O: TByteArray absolute Dest; C: Integer; T,K: Byte; begin with RCx do for C := 0 to Count -1 do begin Inc(I); T := D[I]; Inc(J, T); D[I] := D[J] xor F; D[J] := T - F; Inc(T, D[I]); K := S[C] xor D[T]; O[C] := K; F := F xor K; end; end; function RCxEncode(var RCx: TRCxContext; const Value: String): String; var Count: Integer; begin Count := Length(Value); SetLength(Result, Count); RCxEncode(RCx, Value[1], Result[1], Count); end; function RCxDecode(var RCx: TRCxContext; const Value: String): String; var Count: Integer; begin Count := Length(Value); SetLength(Result, Count); RCxDecode(RCx, Value[1], Result[1], Count); end; function RCxEncode(const Value, Password: String): String; var RCx: TRCxContext; begin RCxInit(RCx, Password); try Result := RCxEncode(RCx, Value); finally RCxDone(RCx); end; end; function RCxDecode(const Value, Password: String): String; var RCx: TRCxContext; begin RCxInit(RCx, Password); try Result := RCxDecode(RCx, Value); finally RCxDone(RCx); end; end; var FRCxRegister: TRCxContext; procedure RCxSeed(const Seed; SeedSize: Integer); begin RCxInit(FRCxRegister, Seed, SeedSize); end; procedure RCxSeed(const Seed: String); begin RCxSeed(Pointer(Seed)^, Length(Seed)); end; procedure RCxRandomize; var Tick: Cardinal; begin Tick := GetTickCount; FRCxRegister.F := Tick; FRCxRegister.I := Tick shr 8; FRCxRegister.J := Tick shr 16; RCxEncode(FRCxRegister, FRCxRegister.D, FRCxRegister.D, SizeOf(FRCxRegister.D)); end; function RCxRandom(Range: Cardinal): Cardinal; type PCardinal = ^Cardinal; begin RCxEncode(FRCxRegister, FRCxRegister.D, FRCxRegister.D, SizeOf(FRCxRegister.D)); Result := PCardinal(@FRCxRegister.D)^; if Range > 1 then Result := Result mod Range; end; function RCxRandomString(Length: Integer): String; var I: Integer; begin SetLength(Result, Length); for I := 1 to Length do begin RCxEncode(FRCxRegister, FRCxRegister.D, FRCxRegister.D, SizeOf(FRCxRegister.D)); Result[I] := Char(FRCxRegister.D[0]); end; end; const FRCxSeed: TGUID = '{F4D35205-2B59-42B0-8B8F-239855B6DD2B}'; initialization RCxSeed(FRCxSeed, SizeOf(FRCxSeed)); finalization end. |
Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp
Der Typ String steht in Delphi 2009 für einen Unicodestring, in früheren Versionen für einen Ansistring.
|
Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp
Durch Delphi 2009 kommen nun halt alle Code-Stellen zum Vorschein, die Strings für Binärdaten missbrauchen. Für Binärdaten sollte man in Delphi 2009 entweder auf TBytes (=array of Byte) or auf RawByteString zurückgreifen.
|
Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp
Reicht es, wenn ich alle String-Vorkommen in AnsiString aendere? Oder gibt es eine neuere Version der RCx.pas?
|
Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp
Zitat:
Delphi 2007 AnsiString = Delphi 2009 RawByteString. Delphi 2009 AnsiString = Delphi 2007 AnsiString mit SetCodePage Aufrufen |
Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp
So ganz haut das noch nicht hin.
[snip] [edit] Ich habe jetzt alles so umbenannt: # String nach AnsiString # PChar nach PAnsiChar # char nach AnsiChar Damit laeufts jetzt. :) [/edit] Danke fuer die Hilfe! :) |
Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp
Zitat:
|
Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp
Ich habe es schon im Hinterkopf, dass es Probleme geben KANN. Aber bei den momentanen Daten klappt es eben und da ich auch nur Zeichen aus dem einfachen Zeichensatz nutze (Versionsnummer + URLs ohne Umlaute), denke ich, dass ich damit hinkommen werde.
|
Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp
Besser wäre ein eigener Typ:
Delphi-Quellcode:
Und dann string überall durch diesen ersetzen, z.B.
type
{$IFDEF VER140} RawAnsiString = type AnsiString($FFFF); {$ELSE} RawAnsiString = type AnsiString; {$ENDIF}
Delphi-Quellcode:
Dann kannst Du es unter beiden Delphi-Versionen kompilieren (bis D2009 sich entscheidet, den Sourcecode in Unicode zu speichern).
function RCxEncode(var RCx: TRCxContext; const Value: RawAnsiString): String; overload;
|
AW: Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp
Zitat:
Delphi-Quellcode:
oder gar sowas
type
{$IF CompilerVersion <= 14.0} RawAnsiString = type AnsiString; {$IFEND}
Delphi-Quellcode:
Ansonsten würde ich hier einfach nach dem Typen gehn, ob dieser existiert
type
{$IF (CompilerVersion >= 7.0) and (CompilerVersion <= 14.0)} RawAnsiString = type AnsiString; {$IFEND}
Delphi-Quellcode:
type
{$IF not Declared(RawAnsiString)} RawAnsiString = type AnsiString; {$IFEND} Wie war das nochmal mit dem D2007? Es gab schon die CodePage in den Strings, aber noch keinen RawByteString, oder wie? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz