Problem z przetłumaczniem funkcji z C# na Delphi.

0

Witam. Mam problem z przepisaniem jeden z funkcji (C#). Jej kod źródłowy to znajduję się na pierwszej stronie w wątku: [C#]Tajemnicza funkcja

W pierwszym poście jest zapisana w QT, a na dole strony znajduję się jej translacja do C#. Próbuje ją przepisać dla Delphi z marnym skutkiem:

function FDigest(input: string): string;

const
  idx: array [0..4] of integer = ($e, $3, $6, $8, $2);
  mul: array [0..4] of integer = (2, 2, 5, 4, 3);
  add: array [0..4] of integer = ($0, $d, $10, $b, $5);

var
  v, t, a, m, i, j: Integer;
  b, tmp: String;

begin

//input := 'f42a8693b3792ff81ac494f5dd15b9c3'; result := '2a541';

Result := '';
if Length(input) <> 32 then Exit;

for j := 0 to 4 do
  begin
    a := add[j];
    m := mul[j];
    i := idx[j];

    t := a + strtoint('$' + copy(input, i, 1));
    v := strtoint('$' + copy(input, t, 2));

    tmp := format('%x', [(v * m) mod 16]);
    b := b + tmp;
  end;

  Result := b;

end;

Jedna z linii jest zakomentowana, można ją odhaczyć w celach diagnostycznych. Chodzi o to, że dla podanego hasha (tego z komentarza) funkcja powinna zwracać ciąg 2a541, a tymczasem nie wiadomo czemu zwraca mi 00bc9.

Pomoże ktoś ?

dodanie znacznika <code class="delphi"> - fp

0

Odpluskwiacz (ang. Debugger)

0

Chyba coś takiego:

function FDigest(input: string): string;

const
  idx: array [0..4] of integer = ($e, $3, $6, $8, $2);
  mul: array [0..4] of integer = (2, 2, 5, 4, 3);
  add: array [0..4] of integer = ($0, $d, $10, $b, $5);

var
  v, t, a, m, i, j: Integer;
  b, tmp: String;
begin

//input := 'f42a8693b3792ff81ac494f5dd15b9c3'; result := '2a541';

Result := '';
if Length(input) <> 32 then Exit;

for j := 0 to 4 do
  begin
    a := add[j];
    m := mul[j];
    i := idx[j];

    t := a + strtoint('$' + input[i + 1]);
    v := strtoint('$' + input[t+1] + input[t+2]);

    tmp:= format('%x', [(v * m) mod 16]);
    b := b + tmp;
  end;

  Result := b;
end;

a to dlatego że w Delphi znaki w stringu są indeksowane od 1 wiec trzeba było dodać 1 do indeksu kopiowanego znaku (mogło zostać copy jak miałeś tylko odpowiednio i + 1 i t + 1)

0

Wieeeelkie dzięki, działa :) Zupełnie to przeoczyłem! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1