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

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

Автор Bob Swart

Подобно Π½Π°Π±ΠΎΡ€Ρƒ символов XXencode, Π½Π°Π±ΠΎΡ€ символов Base64 Π½Π΅ являСтся подмноТСством Π½Π°Π±ΠΎΡ€Π° символов ASCII.

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ массив прСобразования Π² Π½Π°Π±ΠΎΡ€ символов Base64 ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Triplet2Kwartet ΠΈ Kwartet2Triplet для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°:

 const

   B64: Array[0..63] of Char =

      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';


 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 Base64 then

     for i:=0 to 3 do

       Kwartet[i] := Ord(B64[(Kwartet[i] - Ord(SP)) mod $40])

   else

     if XXCode then

       for i:=0 to 3 do

         Kwartet[i] := Ord(XX[(Kwartet[i] - Ord(SP)) mod $40])

 end {Triplet2Kwartet};


 procedure Kwartet2Triplet(Kwartet: TKwartet; var Triplet: TTriplet);

 var

   i: Integer;

 begin

   if Base64 then

   begin

     for i:=0 to 3 do

     begin

       case Chr(Kwartet[i]) of

        'A'..'Z': Kwartet[i] := 0 + Kwartet[i]

                                  - Ord('A') + Ord(SP);

        'a'..'z': Kwartet[i] := 26+ Kwartet[i]

                                  - Ord('a') + Ord(SP);

        '0'..'9': Kwartet[i] := 52+ Kwartet[i]

                                  - Ord('0') + Ord(SP);

             '+': Kwartet[i] := 62+ Ord(SP);

             '/': Kwartet[i] := 63+ Ord(SP);

       end

     end

   end

   else

   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};

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Π½ΠΎΠ²ΠΎΠΉ вСрсии появилась новая глобальная пСрСмСнная, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° кодирования.

1.1.4. MIME

MIME ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Multipurpose Internet Mail Extensions (Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΏΠΎΡ‡Ρ‚Ρ‹), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹ΠΌ стандартом являСтся ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Base64. Π”Π°Π½Π½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ для многоязычной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΈ прСобразования символов ΠΌΠ΅ΠΆΠ΄Ρƒ систСмами (Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ IBM ΠΌΠ΅ΠΉΠ½Ρ„Ρ€Π΅ΠΉΠΌΡ‹, систСмы Π½Π° Π±Π°Π·Π΅ UNIX, Macintosh ΠΈ IBM PC).

MIME Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ кодирования базируСтся Π½Π° RFC1341 ΠΊΠ°ΠΊ MIME Base64. Подобно UUencode, Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ MIME ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ½ΠΈ смогли ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Π΅ систСмы, ΠΈ MIME ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для этого Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ кодирования Base64, плюс Π½Π°Π±ΠΎΡ€ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов ΠΈ ΠΎΠΏΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ содСрТимом MIME.

1.1.5. TBUUCode ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ интСрфСйса ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TUUCode, базируСтся Π½Π° Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ±ΡŠΡΡΠ½Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Triplet2Kwartet ΠΈ Kwartet2Triplet, Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ условноС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² зависимости ΠΎΡ‚ вСрсий Delphi ΠΈ C++Builder.

unit UUCode;

 interface

 uses

 {$IFDEF WIN32}

   Windows,

 {$ELSE}

   WinTypes, WinProcs,

 {$ENDIF}

   SysUtils, Messages, Classes, Graphics, Controls, Forms;


 {$IFNDEF WIN32}

 type

   ShortString = String;

 {$ENDIF}


 type

   EUUCode = class(Exception);


   TAlgorithm = (filecopy, uuencode, uudecode, xxencode, xxdecode, Base64encode, Base64decode);

   TUnixCRLF = (CRLF, LF);


   TProgressEvent = procedure(Percent:Word) of Object;


   TBUUCode = class(TComponent)

   public

   { Public class declarations (override) }

     constructor Create(AOwner: TComponent); override;


   private

   { Private field declarations }

     FAbout: ShortString;

     FActive: Boolean;

     FAlgorithm: TAlgorithm;

     FFileMode: Word;

     FHeaders: Boolean;

     FInputFileName: TFileName;

     FOutputFileName: TFileName;

     FOnProgress: TProgressEvent;

     FUnixCRLF: TUnixCRLF;

   { Dummy method to get read-only About property }

     procedure Dummy(Ignore: ShortString);


   protected

   { Protected Activate method }

     procedure Activate(GoActive: Boolean);


   public

   { Public UUCode interface declaration }

     procedure UUCode;


   published

   { Published design declarations }

     property About: ShortString read FAbout write Dummy;

     property Active: Boolean read FActive write Activate;

     property Algorithm: TAlgorithm read Falgorithm write FAlgorithm;

     property FileMode: Word read FFileMode write FFileMode;

     property Headers: Boolean read FHeaders write FHeaders;

     property InputFile: TFileName read FInputFileName write FInputFileName;

     property OutputFile: TFileName read FOutputFileName write FOutputFileName;

     property UnixCRLF: TUnixCRLF read FUnixCRLF write FUnixCRLF;


   published

   { Published Event property }

     property OnProgress: TProgressEvent read FOnProgress write FOnProgress;

   end {TUUCode};


1.1.6. Бвойства

TUUCode ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ восСмь ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… свойств (ΠΌΡ‹ здСсь опустим описаниС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий):

Бвойство About содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€Π°Π²Π°Ρ… ΠΈ вСрсии.

Бвойство Active ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° прСобразования UUCode Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (design time), ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ свойству Active Ρƒ TTables ΠΈ Tquery ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

Бвойство Algorithm содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ кодирования для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° UUCode. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹:

Β· filecopy – простоС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° InputFile Π² Ρ„Π°ΠΉΠ» OutputFile

Β· uuencode – ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° uuencode ΠΈΠ· Ρ„Π°ΠΉΠ»Π° InputFile ΠΈ гСнСрация Ρ„Π°ΠΉΠ»Π° OutputFile

Β· uudecode – ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° uudecode ΠΈΠ· Ρ„Π°ΠΉΠ»Π° InputFile (ΠΈ гСнСрация Ρ„Π°ΠΉΠ»Π° OutputFile, Ссли Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Headers)

Β· xxencode – ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° xxencode ΠΈΠ· Ρ„Π°ΠΉΠ»Π° InputFile ΠΈ гСнСрация Ρ„Π°ΠΉΠ»Π° OutputFile

Β· xxdecode – ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° xxdecode ΠΈΠ· Ρ„Π°ΠΉΠ»Π° InputFile (ΠΈ гСнСрация Ρ„Π°ΠΉΠ»Π° OutputFile, Ссли Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Headers)

Β· Base64encode – ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Base64 encode InputFile ΠΈ гСнСрация Ρ„Π°ΠΉΠ»Π° OutputFile

Β· Base64decode – ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Base64 decode InputFile (ΠΈ гСнСрация Ρ„Π°ΠΉΠ»Π° OutputFile, Ссли Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Headers)

Бвойство FileMode содСрТит ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ„Π°ΠΉΠ»Π° (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 0644 ΠΈΠ»ΠΈ 0755). Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΠΆΠΈΠΌ задаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ дСсятичных Ρ†ΠΈΡ„Ρ€.

Бвойство Headers ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано для указания Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ begin-end Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ кодирования ΠΈΠ»ΠΈ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ΡΡ Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ дСкодирования. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ True.

Бвойство InputFile содСрТит имя Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° для кодирования/дСкодирования.

Бвойство OutputFile содСрТит имя Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ записан Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ кодирования. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ свойство OutputFile игнорируСтся ΠΏΡ€ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Ссли Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ имя Ρ„Π°ΠΉΠ»Π° для дСкодирования.

Бвойство UnixCRLF ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для указания Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ строк спСцифичных для Unix систСм, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Line Feed (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки) ΠΈΠ»ΠΈ DOS/Windows, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π° Carriage Return/Line Feed (Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ/ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ CRLF, Π½ΠΎ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ для Unix систСм.