Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi C# zu Pas (https://www.delphipraxis.net/137578-c-zu-pas.html)

magoo2002de 23. Jul 2009 19:30


C# zu Pas
 
Hallo :)
Nach langer Zeit bin auch mal wieder da und benötige gleich mal wieder eure Hilfe.
Und zwar habe ich eine Funktion die in C# programmiert wurde und dich ich gerne in meiner Delphi-Anwendung benutzen möchte.
Die Funktion in C#
Code:
internal static int HttpHash(string[] hashParams) {
    int b = -1, i, j;
    uint a, c;
    if (hashParams.Length == 0)
        return -1;
    for (i = 0; i < hashParams.Length; i++) {
        for (j = 0; j < hashParams[i].Length; j++) {
            c = hashParams[i][j];
            a = (uint)(c ^ b) + (c << 8);
            b = (int)(a >> 24) | (int)(a << 8);
        }
    }
    return System.Math.Abs(b);
}
Und hier ist das was ich bereits habe
Delphi-Quellcode:
function HttpHash(HashParams: String): Integer;
var
  b, i, j, a, c: Integer;
begin
  b := -1;
  if Length(HashParams) = 0 then
  begin
    Result := -1;
    Exit;
  end;
  for i := 0 to Length(HashParams) do
  begin
    // Hier komme ich nicht weiter...
  end;
end;
Ich hoffe, dass es soweit richtig ist und das jemand mir hilft den Rest auch noch zu übersetzen.
Vielen Dank schon einmal im voraus :)

cruiser 23. Jul 2009 19:38

Re: C# zu Pas
 
hashparams ist kein String sondern ein Array aus strings
in der Schleife mit i gehst du das Array durch, in der Schleife mit j die einzelnen Strings

Namenloser 23. Jul 2009 19:38

Re: C# zu Pas
 
Wenn ich es richtig verstehe, müsste es so heißen:
Delphi-Quellcode:
function HttpHash(HashParams: array of string): Integer;
var
  b, i, j: Integer;
  a, c: cardinal;
begin
  b := -1;
  if Length(HashParams) = 0 then
  begin
    Result := -1;
    Exit;
  end;
  for i := 0 to Length(HashParams) do
  begin
    for j := 1 to length(HashParams[i]) do
    begin
      c := ord(HashParams[i][j]);
      a := cardinal((c xor b) + (c shl 8));
      b := integer((a shr 24) or integer((a shl 8)));
    end;
  end;
  result := abs(b);
end;

himitsu 23. Jul 2009 19:43

Re: C# zu Pas
 
Code:
for (i = 0; i < hashParams.Length; i++) {
< hashParams.Length entspricht eigentlich to Length(HashParams) - 1
(solange wie i kleiner Length)

string[] scheint ein array of string zu sein und nicht nur string

x ^ y = Power(x, y) x xor y
<< = shl
>> = shr
(int)(... >> ...) = int kannst'e in Delphi ignorieren

bei der Schleife für j mußt'e aufassen, da der Delphi-String mit 1 beginnend intiziert wird.
demnach alles um 1 größer, also for j := 1 to Length(hashParams[i].Length) do

[add]
daß hier auch alle gleich die Lösung verraten müssen ... da kann man ja nix mehr selber lösen :angel2:

aber a und c würde ich als Integer definieren und das ganz Integer- bzw. Cardinal-Gekaste weglassen ... Delphi beachtet bei diesen Binäroperationen eh keine Vorzeichen.

magoo2002de 23. Jul 2009 20:08

Re: C# zu Pas
 
Vielen Dank :)
Das ging ja echt schnell.
Ich werde mir das jetzt mal genauer anschauen, um zu verstehen, wie die Umwandlung gemacht worden ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz