ΠΠΎΠ²ΠΎΡΡ ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΅Π³ΠΎ Π² ΠΠ°ΡΠΊΠ°Π»Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ²Π°ΡΡΠ΅ΡΠΎΠ² ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΡΡΠΈΠΏΠ»Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ:
procedure Kwartet2Triplet(const Kwartet: TKwartet; var Triplet: TTriplet);
var
i: Integer;
begin
Triplet[0] := ((Kwartet[0] - Ord(SP)) SHL 2) +
(((Kwartet[1] - Ord(SP)) AND $30) SHR 4);
Triplet[1] := (((Kwartet[1] - Ord(SP)) AND $0F) SHL 4) +
(((Kwartet[2] - Ord(SP)) AND $3C) SHR 2);
Triplet[2] := (((Kwartet[2] - Ord(SP)) AND $03) SHL 6) +
((Kwartet[3] - Ord(SP)) AND $3F)
end {Kwartet2Triplet};
ΠΡΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠΈΠΏΠ»Π΅ΡΠ° Π² ΡΠ°ΠΉΠ»Π΅ ΠΌΠ΅Π½Π΅Π΅ 3 Π±Π°ΠΉΡ (4 Π±Π°ΠΉΡΠ° Π² ΠΊΠ²Π°ΡΡΠ΅ΡΠ΅), ΡΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π½ΡΠ»ΡΠΌΠΈ ΠΏΡΠΈ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.
1.1.2. XXEncode ΠΈ XXDecode
UUΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ ΡΠΎΡΠΌΠ°ΡΠΎΠΌ 64 Π±ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½Π°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½Π΅ ΠΌΠΎΠ³ ΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π°Π±ΠΎΡΠ°ΠΌΠΈ ASCII ΠΈ EBCDIC (IBM ΠΌΠ΅ΠΉΠ½ΡΡΠ΅ΠΉΠΌΡ). XXencode ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆ Π½Π° UUEncode, ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄ΡΡΠ³ΠΎΠΉ Π½Π°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ EBCDIC ΠΈ ASCII.
ΠΠ°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² XXEncode 0 + 8 6 16 E 24 M 32 U 40 c 48 k 56 s 1 β 9 7 17 F 25 N 33 V 41 d 49 l 57 t 2 0 10 8 18 G 26 O 34 W 42 e 50 m 58 u 3 1 11 9 19 H 27 P 35 X 43 f 51 n 59 v 4 2 12 A 20 I 28 Q 36 Y 44 g 52 o 60 w 5 3 13 B 21 J 29 R 37 Z 45 h 53 p 61 x 6 4 14 C 22 K 30 S 38 a 46 i 54 q 62 y 7 5 15 D 23 L 31 T 39 b 47 j 55 r 63 zΠΠ°ΠΌΠ΅ΡΠΈΠΌ ΡΡΠΎ Π΅ΡΠ»ΠΈ Π΄Π»Ρ UUEncodeΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π°Π±ΠΎΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ASCII (32..96), ΡΠΎ Π΄Π»Ρ XXEncode ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ.
ΠΠ»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ Triplet2Kwartet ΠΈ Kwartet2Triplet Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΌΡ Π²Π²ΠΎΠ΄ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈΠ· 64 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
ΠΠ°ΠΌ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Triplet2Kwartet ΠΈ Kwartet2Triplet ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
const
XX: Array[0..63] of Char =
'+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
procedure Triplet2Kwartet(const Triplet: TTriplet; var Kwartet: TKwartet);
var
i: Integer;
begin
Kwartet[0] := (Triplet[0] SHR 2);
Kwartet[1] := ((Triplet[0] SHL 4) AND $30) +
((Triplet[1] SHR 4) AND $0F);
Kwartet[2] := ((Triplet[1] SHL 2) AND $3C) +
((Triplet[2] SHR 6) AND $03);
Kwartet[3] := (Triplet[2] AND $3F);
for i:=0 to 3 do
if Kwartet[i] = 0 then Kwartet[i] := $40 + Ord(SP)
else Inc(Kwartet[i],Ord(SP));
if XXCode then
for i:=0 to 3 do Kwartet[i] := Ord(XX[(Kwartet[i] - Ord(SP)) mod $40])
end {Triplet2Kwartet};
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ Π½ΠΎΠ²ΡΠ΅ Π΄Π»Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Triplet2Kwartet ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π½Π°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² XXencode Π΄Π»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ UUEncode Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΌΡ ΠΊ Π½Π΅ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΠ΄ #32, ΡΠ°ΠΊ ΡΡΠΎ Π΅ΡΠ»ΠΈ XXencode ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π² UUEncode, ΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΡΠ΅ΡΡΡ 32 ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠ°ΠΊ ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΡΠ°Π±Π»ΠΈΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² XXencode.
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΈ ΠΊ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ Kwartet2Triplet, Π³Π΄Π΅ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ XXencode ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° UUdecode (Π·Π°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Kwartet ΠΊΠ°ΠΊ const).
procedure Kwartet2Triplet(Kwartet: TKwartet; var Triplet: TTriplet);
var
i: Integer;
begin
if XXCode then
begin
for i:=0 to 3 do
begin
case Chr(Kwartet[i]) of
'+': Kwartet[i] := 0 + Ord(SP);
'-': Kwartet[i] := 1 + Ord(SP);
'0'..'9': Kwartet[i] := 2 + Kwartet[i]
- Ord('0') + Ord(SP);
'A'..'Z': Kwartet[i] := 12 + Kwartet[i]
- Ord('A') + Ord(SP);
'a'..'z': Kwartet[i] := 38 + Kwartet[i]
- Ord('a') + Ord(SP)
end
end
end;
Triplet[0] := ((Kwartet[0] - Ord(SP)) SHL 2) +
(((Kwartet[1] - Ord(SP)) AND $30) SHR 4);
Triplet[1] := (((Kwartet[1] - Ord(SP)) AND $0F) SHL 4) +
(((Kwartet[2] - Ord(SP)) AND $3C) SHR 2);
Triplet[2] := (((Kwartet[2] - Ord(SP)) AND $03) SHL 6) +
((Kwartet[3] - Ord(SP)) AND $3F)
end {Kwartet2Triplet};
ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π² Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΡΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ XXCode Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
1.1.3. Base64
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Base64 ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² UUencode ΠΈ XXencode ΡΠ΅ΠΌ, ΡΡΠΎ Π² Π½Π΅ΠΌ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΊΠ°ΠΊ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ Π΄Π»ΠΈΠ½Ρ. ΠΠ±ΡΠ΅Π΅ ΡΠΎ ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΠΏΠ»Π΅ΡΠΎΠ² Π² ΠΊΠ²Π°ΡΡΠ΅ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ 64 Π±Π°ΠΉΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Base64 0 A 8 I 16 Q 24 Y 32 g 40 o 48 w 56 4 1 B 9 J 17 R 25 Z 33 h 41 p 49 x 57 5 2 C 10 K 18 S 26 a 34 I 42 q 50 y 58 6 3 D 11 L 19 T 27 b 35 j 43 r 51 z 59 7 4 E 12 M 20 U 28 c 36 k 44 s 52 0 60 8 5 F 13 N 21 V 29 d 37 l 45 t 53 1 61 9 6 G 14 O 22 W 30 e 38 m 46 u 54 2 62 + 7 H 15 P 23 X 31 f 39 n 47 v 55 3 63 /ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π°Π±ΠΎΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² XXencode, Π½Π°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Base64 Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ Π½Π°Π±ΠΎΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ASCII.