04. marts 2004 - 16:34Der er
19 kommentarer og 2 løsninger
Chr/Ord function
Hej!
Jeg har lavet min eget CHR og ORD funktion for selv at kunne bestemme hvilke bogstaver de skal bruge. fx. charMask = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789';
Mit problem ligger i at når jeg laver en FOR sætning og kører alle bogstaverne igennem og pludser fx 100 til hver char og kører dem igennem igen og trækker 100 fra får jeg ikke det samme resultat ud som jeg startede med. abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789 abcdefghinklmnopqrstuvwxyAABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789 ^ Er der ongle der kan se hvad der er galt Her er sourcen til dem:
var Form1: TForm1; characters : array[0..62] of char; codeCount, counter : integer; code : string; const charMask = 'aabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789';
// Limited Char function
function lChar (num : integer) : char; begin characters := charMask; if num > 0 then begin if num > length(characters) then begin repeat num := num - (length(characters)); until num < length(characters); result := characters[num]; end else begin result := characters[num]; end; end else begin if num < 0 then begin repeat num := num + (length(characters)); until num > 0;
result := characters[num]; end else begin result := characters[num]; end; end; end;
// Function End
// Limited Ord Function
function lOrd(chara : char) : integer; var i : integer; begin characters := charMask; if chara <> '' then for i := 0 to length(characters) do begin if chara = characters[i] then begin Result := i; end; end; end;
jeg er desværre stadig ikke med. hvad er "en modulus" og hvor er det du vil bruge +100 og -100 men en modulus og en ekstra +længde. i FOR sætningen? Jeg er ikke en vildt god programmør... :)
Jeg har kigget din kode igennem og jeg fattede først O og en brik. Endte med ræsonnere mig frem til at det må være nogenlunde det samme som dette her:
const Characters : array[0..62] of char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789';
function lChr(aNum : integer) : char; begin if aNum <= length(characters) then result := characters[aNum]; end;
// Limited Ord Function
function lOrd(aCh : char) : integer; begin result := pos(aCh,Characters) - 1; end;
Det giver stadigvæk ikke megen fornuft, for hvorfor vil du lægge 100 til og trække 100 fra? Idet du justerer aNum hvis karakteren er > lgd, så forvansker du bare dine data - her er ikke tale om kryptering.
Der er indbygget en fejlmulighed i at dit array begynder med 0 og positionerne i din streng begynder med 1. Fx. er characters[0] ikke defineret. Iøvrigt er arrayet så vidt jeg kan se overflødigt.
HRC >> Ja det er meningen funktionerne skal bruges til at kryptere med og selvfølgelig vil jeg ikke bare ligge 100 til og trække 100 fra igen. Men der er jo ingen grund til at gøre det mere avanceret en højst nødvendigt, før jeg får selve funktionerne til at virke. Grunden til at lChar funktionen er så lang er at hvis tallet der kommer ind fx er 14050 sakl den selv forkorte det ned til det er indenfor arrayets længde og selv rette hvis tallet er negativt.
type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; Edit4: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; characters : array[0..61] of char; const charMask = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTYVWXYZ0123456789';
implementation
{$R *.dfm} // Limited Char function
function lChar (num : integer) : char; begin characters := charMask; if num > 0 then begin if num > length(characters) then begin repeat num := num - (length(characters)); until num < length(characters); result := characters[num]; end else begin result := characters[num]; end; end else begin if num < 0 then begin repeat num := num + (length(characters)); until num > 0;
result := characters[num]; end else begin result := characters[num]; end; end; end;
// Function End
// Limited Ord Function
function lOrd(chara : char) : integer; var i : integer; begin characters := charMask; if chara <> '' then for i := 0 to length(characters) do begin if chara = characters[i] then begin Result := i; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin Edit2.Text := ''; Edit3.Text := ''; for i := 1 to length(edit1.Text) do begin edit2.Text := edit2.Text + lchar(lord(edit1.text[i])+100); end; for i := 1 to length(edit2.Text) do begin edit3.Text := edit3.Text + lchar(lord(edit2.text[i])-100); end; end; end.
function encrypt(tekst,kode:string):string; var I: integer; begin for I := 1 to length(tekst) do begin tekst[I] := chr(ord(tekst[I])+ord(kode[(I mod length(kode))+1])); end; result := tekst; end;
function decrypt(tekst,kode:string):string; var I: integer; begin for I := 1 to length(tekst) do begin tekst[I] := chr(ord(tekst[I])-ord(kode[(I mod length(kode))+1])); end; result := tekst; end; var t : string; begin t := 'Dette er en prøve'; writeln(decrypt(encrypt(t, 'hemmeligt'), 'hemmeligt')); t := ''; writeln(decrypt(encrypt(t, 'hemmeligt'), 'hemmeligt')); end.
begin for I := 1 to length(tekst) do begin tekst[I] := chr(32+((ord(tekst[I])-32)+(ord(kode[(I mod length(kode))+1])-32)) mod 96); end; result := tekst; end;
function decrypt(tekst,kode:string):string;
var I: integer;
begin for I := 1 to length(tekst) do begin tekst[I] := chr(32+(96 + (ord(tekst[I])-32)-(ord(kode[(I mod length(kode))+1])-32)) mod 96); end; result := tekst; end;
var t : string;
begin t := 'Dette er en proeve'; writeln(t); writeln(encrypt(t, 'hemmeligt')); writeln(decrypt(t, 'hemmeligt')); writeln(decrypt(encrypt(t, 'hemmeligt'), 'hemmeligt')); writeln(encrypt(decrypt(t, 'hemmeligt'), 'hemmeligt')); end.
Jo tak :) men krypteringen kan jeg godt selv klarer. meningen er at lChar/lOrd skal bruges til kun at enkryptere de bogstaver der er i arrayet så den fx ikke laver om på linieskift og andre tegn...
Hvis du laver "characters : array[0..61] of char;" om til "characters : array[1..62] of char;" virker dit program :-) Men der er masser af muligheder for optimering - men det var jo ikke det du bad om hjælp til.
function lChar (num : integer) : char; begin if num > 0 then begin if num > length(characters) then begin repeat num := num - (length(characters)); until num < length(characters); result := characters[num]; end else begin result := characters[num]; end; end else begin if num < 0 then begin repeat num := num + (length(characters)); until num > 0;
result := characters[num]; end else begin result := characters[num]; end; end; end;
// Function End
// Limited Ord Function
function lOrd(chara : char) : integer; var i : integer; begin result := pos(chara,Characters) ; end;
procedure predefine; begin // Predefined Variables (Reset) //---------- end;
procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin predefine; Edit2.Text := ''; Edit3.Text := ''; for i := 1 to length(edit1.Text) do begin edit2.Text := edit2.Text + lchar(lord(edit1.text[i])+100); end; for i := 1 to length(edit2.Text) do begin edit3.Text := edit3.Text + lchar(lord(edit2.text[i])-100); end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.