Börjar bli rostig på avancerad Delphikod. I Pascal kan man ha lokala funktioner: Martin eller någon annan, kan Ni förklara vad koden egentligen skall göra ? Det verkar vara någon sorts kryptering av siffertal i en sträng. Nyfiken som jag var så klippte in koden i ett Delphi-program och testade. Insträngen "12345" gav "000004«)". Ja det är rätt.Någon som har lust förklara ?
Kolla på function <b>FUNCTION PackNBr(Nbr : REAL ; Cifre : INTEGER) : STRING;</b>
fattar inte hur den funkar, den lämnar ju aldrig något i retur.
Vad gör det sista <b>BEGIN</b> just före <b>END.</b>
<code>
Unit Pack50;
{Denne Unit packer/udpacker en nummerisk string i 50 tals system}
INTERFACE
FUNCTION DoPack50(InPack : STRING) : String;
FUNCTION DoUnPack50(InUnPack : STRING) : String;
IMPLEMENTATION
CONST
PackChars : STRING[50] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#œ-$%_()«&{}';
FUNCTION REALDiv(A, B: REAL) : REAL;
BEGIN
REALDiv := INT(A/B);
END;
FUNCTION ToREAL(InString : STRING) : REAL;
VAR
OK : BOOLEAN;
Count : INTEGER;
TmpResult : REAL;
BEGIN
OK := TRUE;
Count := 1;
TmpResult := 0.0;
While (Count <=Length(Instring)) AND OK DO
BEGIN
IF InString[Count] in ['0'..'9'] THEN
BEGIN
TmpResult := TmpResult * 10 + (ORD(InString[Count])-$30);
END
ELSE
BEGIN
OK := FALSE;
END;
INC(Count);
END;
IF OK THEN
BEGIN
ToREAL := TmpResult;
END
ELSE
BEGIN
ToREAL := 0.0;
END;
END;
FUNCTION PackNBr(Nbr : REAL ; Cifre : INTEGER) : STRING;
VAR
Rest, Count : INTEGER;
TmpResult : STRING;
FUNCTION GetRest(A, B : REAL) : INTEGER;
VAR
C : REAL;
BEGIN
C := REALDiv(A,B);
GetRest := Round(A-C*B);
END;
BEGIN
TmpResult := '';
FOR Count := 1 TO CIFRE DO
BEGIN
Rest := GetRest(Nbr, 50);
Nbr := REALDiv(Nbr,50);
TmpResult := PackChars[Rest+1] + TmpResult;
END;
PackNBr := TmpResult;
END;
FUNCTION UnPackNbr(InString : STRING) : REAL;
VAR
Count : INTEGER;
P : LONGINT;
OK : BOOLEAN;
TmpResult : REAL;
BEGIN
TmpResult := 0.0;
OK := TRUE;
Count := 1;
WHILE (Count <= Length(InString)) AND OK DO
BEGIN
P := Pos(InString[Count], PackChars)-1;
IF P >= 0 THEN
BEGIN
TmpResult :=(TmpResult*50)+P;
END
ELSE
BEGIN
OK := FALSE;
END;
INC(Count);
END;
IF OK THEN
UnPackNbr := TmpResult
ELSE
UnPackNBr := -1;
END;
FUNCTION DoPack50(InPack : STRING) : String;
BEGIN
DoPack50 := PackNbr(ToREAL(InPAck),8);
END;
FUNCTION DoUnPack50(InUnPack : STRING) : String;
VAR
TmpResult : STRING;
BEGIN
TmpResult := '';
STR(UnPackNbr(InUnPack):1:0,TmpResult);
DoUnpack50 := TmpResult;
END;
BEGIN
END.
</code>Sv: Någon som har lust förklara ?
dvs PackNBr ser ut så här:
<code>
FUNCTION PackNBr(Nbr : REAL ; Cifre : INTEGER) : STRING;
VAR
Rest, Count : INTEGER;
TmpResult : STRING;
BEGIN
TmpResult := '';
FOR Count := 1 TO CIFRE DO
BEGIN
Rest := GetRest(Nbr, 50);
Nbr := REALDiv(Nbr,50);
TmpResult := PackChars[Rest+1] + TmpResult;
END;
PackNBr := TmpResult;
END;
</code>
och GetRest är en lokal funktion.Sv: Någon som har lust förklara ?
Någon form av kryptering/packkning ?
Sitter som tidsfördriv och terapi översätter till VB
När jag provkör Vb och DoPack50 får jag detta underliga svar
<b>0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#œ-$%_()«&{}
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#œ-$%_()«&{}
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#œ-$%_()«&{}
BCDEFGHIJKLMNOPQRSTUVWXYZ!@#œ-$%_()«&{}@#œ-$%_()«&{}
œ-$%_()«&{}456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#œ-$%_()«&{}
NOPQRSTUVWXYZ!@#œ-$%_()«&{}</b>
DSSv:Någon som har lust förklara ?
Sv: Någon som har lust förklara ?
Vi fick tag i ett facitresultat.
885 skall bli 000000HZ
Programarkivet:Ny DoPack50_UnPack50