[Delphi] Funkcja Adama i listbox

0

Mam w buttonclick coś takiego

for i:=1 to 20 do listbox1.Items.Add('abcgh');
for i:=1 to listbox1.Count-1 do begin
a:=listbox1.Items[i];
b:='a';
listbox2.Items.Add(Szyfruj(a,b)) end;

label1.Caption:=inttostr(listbox1.Count);
label2.Caption:=inttostr(listbox2.Count);

To jest funkcja szyfruj Adam ją napisał w jednym artykule

function Szyfruj(sString, Password : String) : String;
var
I : Integer;
PassCount : Integer;
begin
PassCount := 0;
Result := sString; // przypisz wartosc poczatkowa
for I := 1 to Length(sString) do // wykonuj dla kazdej litery osobno
begin
{
Dla kazdego osobnego znaku zamieniaj na wartosc liczbowa, a nastepnie
xoruj z kazda litera hasla - powstaje wowczas unikalna kombinacja.
}
Result[i] := Chr(Ord(sString[i]) xor Ord(Password[PassCount]));
Inc(PassCount); // wieksz licznik - kolejne slowo hasla
{ Jezeli licznik przekroczy dlugosc hasla - wyzeruj }
if PassCount > Length(Password) then PassCount := 0;
end;
end;

  1. Dlaczego mi na labelach pokazuje różne wartości 20 i 19 co jest nie tak, a jak nacisne po raz 2 to mam 40 i 58
  2. Jak odwrocić działanie funkcji

Mimo iż na razie to testuje ale chciałbym to wykorzystać do kodowania pliku

0
  1. Powtórz ;]
0
  1. Powtórz ;]

Funkcja koduje tekst w tym przypadku listboxa chodzi o rozkodowanie

[b]Pierwsze już zrobiłem, ale do drugiego potrzebuje pomocy[/b]

0

daj jeszcze funkcje deszyfrującą;P

0

sorka za to na gurze [niewinnosc]
podam ci moje funkcje ... albo nie cały unit;)

unit enigma;

interface

function Encode64(S: string): string;
function Decode64(S: string): string;
implementation
const
Codes64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzźćółęśąńżŹĆÓŁĘŚĄŃŻ+/';
function Encode64(S: string): string;
var
i: Integer;
a: Integer;
x: Integer;
b: Integer;
begin
Result := '';
a := 0;
b := 0;
for i := 1 to Length(s) do
begin
x := Ord(s[i]);
b := b * 256 + x;
a := a + 8;
while a >= 6 do
begin
a := a - 6;
x := b div (1 shl a);
b := b mod (1 shl a);
Result := Result + Codes64[x + 1];
end;
end;
if a > 0 then
begin
x := b shl (6 - a);
Result := Result + Codes64[x + 1];
end;
end;
function Decode64(S: string): string;
var
i: Integer;
a: Integer;
x: Integer;
b: Integer;
begin
Result := '';
a := 0;
b := 0;
for i := 1 to Length(s) do
begin
x := Pos(s[i], codes64) - 1;
if x >= 0 then
begin
b := b * 64 + x;
a := a + 6;
if a >= 8 then
begin
a := a - 8;
x := b shr a;
b := b mod (1 shl a);
x := x mod 256;
Result := Result + chr(x);
end;
end
else
Exit;
end;
end;
end.

niewiem z kąt to wziĄłem chyba z http://www.torry.net albo jakoś ale wiem że działa bo zrobiłem program notatnik z kodowaniem i dekodowaniem...

0

for i:=1 to 20 do listbox1.Items.Add('abcgh');
for i:=1 to listbox1.Count-1 do begin
a:=listbox1.Items[i];
b:='a';
listbox2.Items.Add(Szyfruj(a,b)) end;

label1.Caption:=inttostr(listbox1.Count);
label2.Caption:=inttostr(listbox2.Count);

w drugiej pętli for daj for i := 0 to listbox1.Count-1 do
a nie i := 1 o ile pamiętam to listbox jest indeksowany od zera

wtedy będziesz miał na lebelach 20 i 20.

0

Dzięki za odpowiedź jednak przespałem się z tym i wystarczyło zamienić parametry wywoływania funkcji.
for i:=0 to listbox2.Count-1 do begin
a:=listbox2.Items[i];
b:='ą';
listbox3.Items.Add(Szyfruj(b,a)) end;

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