Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΡ‚ Π΄ΠΎΠΊΡ‚ΠΎΡ€Π° Π‘ΠΎΠ±Π°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 2

Автор Bob Swart

Говоря ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, рСализация Π΅Π³ΠΎ Π² ПаскалС прСобразования ΠΊΠ²Π°Ρ€Ρ‚Π΅Ρ‚ΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Ρ‚Ρ€ΠΈΠΏΠ»Π΅Ρ‚Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ:

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.