📄 fgint.pas
字号:
str2 := '';
initialize8(trans);
For i := 1 To length(str256) Do str2 := str2 + trans[ord(str256[i])];
End;
Procedure ConvertBase64to2(Const str64 : String; Var str2 : String);
Var
trans : Array[0..255] Of String;
i : longint;
Begin
str2 := '';
initialize6(trans);
For i := 1 To length(str64) Do str2 := str2 + trans[ord(str64[i])];
End;
Procedure ConvertBase2to256(str2 : String; Var str256 : String);
Var
i, len8 : longint;
g : char;
Begin
str256 := '';
While (length(str2) Mod 8) <> 0 Do str2 := '0' + str2;
len8 := length(str2) Div 8;
For i := 1 To len8 Do
Begin
zeronetochar8(g, copy(str2, 1, 8));
str256 := str256 + g;
delete(str2, 1, 8);
End;
End;
Procedure ConvertBase2to64(str2 : String; Var str64 : String);
Var
i, len6 : longint;
g : integer;
Begin
str64 := '';
While (length(str2) Mod 6) <> 0 Do str2 := '0' + str2;
len6 := length(str2) Div 6;
For i := 1 To len6 Do
Begin
zeronetochar6(g, copy(str2, 1, 6));
str64 := str64 + chr64[g];
delete(str2, 1, 6);
End;
End;
// Convert base 256 strings to base 16 (HexaDecimal) strings and visa versa
Procedure ConvertBase256StringToHexString(Str256 : String; Var HexStr : String);
Var
i : longint;
b : byte;
Begin
HexStr := '';
For i := 1 To length(str256) Do
Begin
b := ord(str256[i]);
If (b Shr 4) < 10 Then HexStr := HexStr + chr(48 + (b Shr 4))
Else HexStr := HexStr + chr(55 + (b Shr 4));
If (b And 15) < 10 Then HexStr := HexStr + chr(48 + (b And 15))
Else HexStr := HexStr + chr(55 + (b And 15));
End;
End;
Procedure ConvertHexStringToBase256String(HexStr : String; Var Str256 : String);
Var
i : longint;
b, h1, h2 : byte;
Begin
Str256 := '';
For i := 1 To (length(Hexstr) Div 2) Do
Begin
h2 := ord(HexStr[2 * i]);
h1 := ord(HexStr[2 * i - 1]);
If h1 < 58 Then b := ((h1 - 48) Shl 4) Else b := ((h1 - 55) Shl 4);
If h2 < 58 Then b := (b Or (h2 - 48)) Else b := (b Or (h2 - 55));
Str256 := Str256 + chr(b);
End;
End;
// Convert base 256 strings to base 64 strings and visa versa, PGP style
Procedure PGPConvertBase256to64(Var str256, str64 : String);
Var
temp, x, a : String;
i, len6 : longint;
g : integer;
trans : Array[0..255] Of String;
Begin
initialize8(trans);
temp := '';
For i := 1 To length(str256) Do temp := temp + trans[ord(str256[i])];
If (length(temp) Mod 6) = 0 Then a := '' Else
If (length(temp) Mod 6) = 4 Then
Begin
temp := temp + '00';
a := '='
End
Else
Begin
temp := temp + '0000';
a := '=='
End;
str64 := '';
len6 := length(temp) Div 6;
For i := 1 To len6 Do
Begin
x := copy(temp, 1, 6);
zeronetochar6(g, x);
str64 := str64 + PGPchr64[g];
delete(temp, 1, 6);
End;
str64 := str64 + a;
End;
Procedure PGPConvertBase64to256(str64 : String; Var str256 : String);
Var
temp, x : String;
i, j, len8 : longint;
g : char;
trans : Array[0..255] Of String;
Begin
initialize6PGP(trans);
temp := '';
str256 := '';
If str64[length(str64) - 1] = '=' Then j := 2 Else
If str64[length(str64)] = '=' Then j := 1 Else j := 0;
For i := 1 To (length(str64) - j) Do temp := temp + trans[ord(str64[i])];
If j <> 0 Then delete(temp, length(temp) - 2 * j + 1, 2 * j);
len8 := length(temp) Div 8;
For i := 1 To len8 Do
Begin
x := copy(temp, 1, 8);
zeronetochar8(g, x);
str256 := str256 + g;
delete(temp, 1, 8);
End;
End;
// Convert base 64 strings to base 2 strings, PGP style
Procedure PGPConvertBase64to2(str64 : String; Var str2 : String);
Var
i, j : longint;
trans : Array[0..255] Of String;
Begin
str2 := '';
initialize6(trans);
If str64[length(str64) - 1] = '=' Then j := 2 Else
If str64[length(str64)] = '=' Then j := 1 Else j := 0;
For i := 1 To (length(str64) - j) Do str2 := str2 + trans[ord(str64[i])];
delete(str2, length(str2) - 2 * j + 1, 2 * j);
End;
// Convert a base 10 string to a FGInt
Procedure Base10StringToFGInt(Base10 : String; Var FGInt : TFGInt);
Var
i, size : longint;
j : int64;
S : String;
sign : TSign;
Procedure GIntDivByIntBis1(Var GInt : TFGInt; by : int64; Var modres : int64);
Var
i, size : longint;
rest : int64;
Begin
size := GInt.Number[0];
modres := 0;
For i := size Downto 1 Do
Begin
modres := modres * 1000000000;
rest := modres + GInt.Number[i];
GInt.Number[i] := rest Div by;
modres := rest Mod by;
End;
While (GInt.Number[size] = 0) And (size > 1) Do size := size - 1;
If size <> GInt.Number[0] Then
Begin
SetLength(GInt.Number, size + 1);
GInt.Number[0] := size;
End;
End;
Begin
While (Not (Base10[1] In ['-', '0'..'9'])) And (length(Base10) > 1) Do
delete(Base10, 1, 1);
If copy(Base10, 1, 1) = '-' Then
Begin
Sign := negative;
delete(Base10, 1, 1);
End
Else Sign := positive;
While (length(Base10) > 1) And (copy(Base10, 1, 1) = '0') Do delete(Base10, 1, 1);
size := length(Base10) Div 9;
If (length(Base10) Mod 9) <> 0 Then size := size + 1;
SetLength(FGInt.Number, size + 1);
FGInt.Number[0] := size;
For i := 1 To size - 1 Do
Begin
FGInt.Number[i] := StrToInt(copy(Base10, length(Base10) - 8, 9));
delete(Base10, length(Base10) - 8, 9);
End;
FGInt.Number[size] := StrToInt(Base10);
S := '';
While (FGInt.Number[0] <> 1) Or (FGInt.Number[1] <> 0) Do
Begin
GIntDivByIntBis1(FGInt, 2, j);
S := inttostr(j) + S;
End;
S := '0' + S;
FGIntDestroy(FGInt);
Base2StringToFGInt(S, FGInt);
FGInt.Sign := sign;
End;
// Convert a FGInt to a base 10 string
Procedure FGIntToBase10String(Const FGInt : TFGInt; Var Base10 : String);
Var
S : String;
j : int64;
temp : TFGInt;
Begin
FGIntCopy(FGInt, temp);
Base10 := '';
While (temp.Number[0] > 1) Or (temp.Number[1] > 0) Do
Begin
FGIntDivByIntBis(temp, 1000000000, j);
S := IntToStr(j);
While Length(S) < 9 Do S := '0' + S;
Base10 := S + Base10;
End;
Base10 := '0' + Base10;
While (length(Base10) > 1) And (Base10[1] = '0') Do delete(Base10, 1, 1);
If FGInt.Sign = negative Then Base10 := '-' + Base10;
End;
// Destroy a FGInt to free memory
Procedure FGIntDestroy(Var FGInt : TFGInt);
Begin
FGInt.Number := Nil;
End;
// Compare 2 FGInts in absolute value, returns
// Lt if FGInt1 > FGInt2, St if FGInt1 < FGInt2, Eq if FGInt1 = FGInt2,
// Er otherwise
Function FGIntCompareAbs(Const FGInt1, FGInt2 : TFGInt) : TCompare;
Var
size1, size2, i : longint;
Begin
FGIntCompareAbs := Er;
size1 := FGInt1.Number[0];
size2 := FGInt2.Number[0];
If size1 > size2 Then FGIntCompareAbs := Lt Else
If size1 < size2 Then FGIntCompareAbs := St Else
Begin
i := size2;
While (FGInt1.Number[i] = FGInt2.Number[i]) And (i > 1) Do i := i - 1;
If FGInt1.Number[i] = FGInt2.Number[i] Then FGIntCompareAbs := Eq Else
If FGInt1.Number[i] < FGInt2.Number[i] Then FGIntCompareAbs := St Else
If FGInt1.Number[i] > FGInt2.Number[i] Then FGIntCompareAbs := Lt;
End;
End;
// Add 2 FGInts, FGInt1 + FGInt2 = Sum
Procedure FGIntAdd(Const FGInt1, FGInt2 : TFGInt; Var Sum : TFGInt);
Var
i, size1, size2, size : longint;
rest : integer;
Trest : int64;
Begin
size1 := FGInt1.Number[0];
size2 := FGInt2.Number[0];
If size1 < size2 Then FGIntAdd(FGInt2, FGInt1, Sum) Else
Begin
If FGInt1.Sign = FGInt2.Sign Then
Begin
Sum.Sign := FGInt1.Sign;
SetLength(Sum.Number, size1 + 2);
rest := 0;
For i := 1 To size2 Do
Begin
Trest := FGInt1.Number[i] + FGInt2.Number[i] + rest;
Sum.Number[i] := Trest And 2147483647;
rest := Trest Shr 31;
End;
For i := (size2 + 1) To size1 Do
Begin
Trest := FGInt1.Number[i] + rest;
Sum.Number[i] := Trest And 2147483647;
rest := Trest Shr 31;
End;
size := size1 + 1;
Sum.Number[0] := size;
Sum.Number[size] := rest;
While (Sum.Number[size] = 0) And (size > 1) Do size := size - 1;
If Sum.Number[0] > size Then SetLength(Sum.Number, size + 1);
Sum.Number[0] := size;
End
Else
Begin
If FGIntCompareAbs(FGInt2, FGInt1) = Lt Then FGIntAdd(FGInt2, FGInt1, Sum)
Else
Begin
SetLength(Sum.Number, size1 + 1);
rest := 0;
For i := 1 To size2 Do
Begin
Trest := 2147483648 + FGInt1.Number[i] - FGInt2.Number[i] + rest;
Sum.Number[i] := Trest And 2147483647;
If (Trest > 2147483647) Then rest := 0 Else rest := -1;
End;
For i := (size2 + 1) To size1 Do
Begin
Trest := 2147483648 + FGInt1.Number[i] + rest;
Sum.Number[i] := Trest And 2147483647;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -