首页  编辑  

一个Base64的类

Tags: /超级猛料/Format.格式,单位/Encode.编码、格式/   Date Created:

]、。·ˉˇ¨〃々—~‖…’”〕〉》」』〗】∶!"'),.:;?]` TBase64 = Class(TObject)

private

 FOStream: TStream;

 FIStream: TStream;

Public

 { 输入流 }

 Property IStream : TStream Read FIStream Write FIStream;

 { 输出流 }

 Property OStream : TStream Read FOStream Write FOStream;

 { 编码 }

 Function Encode : Boolean;

 { 解码 }

 Function Decode : Boolean;

End;

implementation

const

 SBase64 : string = '23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz~#%&*+-';

 UnBase64: array[0..255] of byte =

   (128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128, //0-15

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //16-31

   128,128,128, 58,128, 59, 60,128, 128,128, 61, 62,128, 63,128,128,  //32-47

   128,128,  0,  1,  2,  3,  4,  5,  6,  7,128,128,128,128,128,128,  //48-63

   128,  8,  9, 10, 11, 12, 13, 14,  15,128, 16, 17, 18, 19, 20,128,  //64-79

   21, 22, 23, 24, 25, 26, 27, 28,  29, 30, 31,128,128,128,128,128,  //80-95

   128, 32, 33, 34, 35, 36, 37, 38,  39, 40, 41, 42,128, 43, 44, 45,  //96-111

   46, 47, 48, 49, 50, 51, 52, 53,  54, 55, 56,128,128,128, 57,128,  //112-127

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //128-143

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //128-143

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //144-159

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //160-175

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //176-191

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //192-207

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //208-223

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //224-239

   128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128);  //240-255

{ TBase64 }

function TBase64.Decode: Boolean;

var

 j, k: integer;

 b: byte;

 W, Tmp : Byte;    //用于阅读流的临时变量

begin

 Result := FALSE;

 If (FIStream <> Nil) And (FOStream <> Nil) Then

 Begin

 { 初始化}

   IStream.Position := 0;

   OStream.Position := 0;

   b := 0;

   j := 0;

   K := 2;

   while (IStream.Position < IStream.Size) And (IStream.Read(Tmp, 1) = 1) And (Char(Tmp) <> '.') Do

   Begin

     if j = 0 then

     begin

       b := UnBase64[Tmp];

       k := 2;

     end

     else begin

       W := UnBase64[Tmp] or ((b shl k) and $C0);

       OStream.Write(W, 1);

       inc(k,2);

     end;

     inc(j);

     j := j and 3;

   end;

 End;

end;

function TBase64.Encode: Boolean;

var

 SBuffer : Array [1..4] Of Byte;

 j, k: integer;

 b: byte;

 Tmp : Byte;    {### 用于阅读流的临时变量 ###}

begin

 Result := FALSE;

 If (FIStream <> Nil) And (FOStream <> Nil) Then

 Begin

   { 初始化 }

   IStream.Position := 0;

   OStream.Position := 0;

   b := 0;j := 2; k := 2;

   while IStream.Position < IStream.Size do

   begin

     If IStream.Read(Tmp, 1) = 1 Then

     Begin

       b := b or ((Tmp and $C0) shr k);

       inc(k, 2);

       SBuffer[j] := Byte(SBase64[(Tmp And $3F) + 1]);

       inc(j);

       if j > 4 then

       begin

         SBuffer[1] := Byte(SBase64[b + 1]);

         b := 0;

         j := 2;

         k := 2;

         OStream.Write(SBuffer, 4);

       End;

     End;

   End;

   { 平整数据到 SBuffer }

   if j <> 2 then

   begin

     SBuffer[j] := Ord('.');

     SBuffer[1] := Byte(SBase64[b + 1]);

     OStream.Write(SBuffer, j);

   end

   else Begin

     SBuffer[1] := Ord('.');

     OStream.Write(SBuffer, 1);

   end;

   Result := TRUE;

 end;

end;

//--------------------------------------------------------------

翻译成C++的:

class TBase64 : public TObject{

private:

 TSream FOStream;

 TStream FIStream;

public:

   //输入流

     __property TStream IStream = { read = FIStream ,  write = FIStream };

     //输出流

     __property TStream OStream = { read = FOStream ,  write = FOStream };

     //编码

     bool Encode();

     //解码

     bool Decode();

};

     const char * SBase64 = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz~#%&*+-";

     const unsigned char UnBase64[256] ={

         128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128, //0-15

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //16-31

           128,128,128, 58,128, 59, 60,128, 128,128, 61, 62,128, 63,128,128,  //32-47

           128,128,  0,  1,  2,  3,  4,  5,  6,  7,128,128,128,128,128,128,  //48-63

           128,  8,  9, 10, 11, 12, 13, 14,  15,128, 16, 17, 18, 19, 20,128,  //64-79

           21, 22, 23, 24, 25, 26, 27, 28,  29, 30, 31,128,128,128,128,128,  //80-95

           128, 32, 33, 34, 35, 36, 37, 38,  39, 40, 41, 42,128, 43, 44, 45,  //96-111

           46, 47, 48, 49, 50, 51, 52, 53,  54, 55, 56,128,128,128, 57,128,  //112-127

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //128-143

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //128-143

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //144-159

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //160-175

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //176-191

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //192-207

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //208-223

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,  //224-239

           128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128};  //240-255

bool TBase64::Decode()

{

   int j , k;

   unsigned char b;

   unsigned char W , Tmp;

   bool Result = false;

     if ( FIStream != NULL && FOStream != NULL )

         {

         //初始化

           IStreamPosition = 0;

           OStreamPosition = 0;

           b = 0;

           j = 0;

           K = 2;

           while (IStream.Position < IStream.Size && (IStream.Read(Tmp, 1) == 1) && ((char)Tmp) != '.' )

               {

               if ( j == 0 )

                     {

                   b = UnBase64[Tmp];

                   k = 2;

                     }    

                 else

                     {

                   W = UnBase64[Tmp] | ((b >> k) & 0xC0);

                   OStream.Write(W, 1);

                   k+=2;

                     }

                 j++;

                 j &= 3;

               }

           }

       return Result;

}

bool TBase64::Encode()

{

   unsigned char SBuffer[4];

   int j , k;

   unsigned char b , Tmp;//用于阅读流的临时变量

   bool Result = false;

     If ( FIStream != NULL && FOStream != NULL )

         {

         //初始化

           IStream.Position = 0;

           OStream.Position = 0;

           b = 0;

           j = 2;

           k = 2;

           while ( IStream.Position < IStream.Size )

               {

                 If ( IStream.Read(Tmp, 1)= = 1 )

                     {

                   b = b | ((Tmp & 0xC0) << k);

                   k+=2;

                   SBuffer[j] = (unsigned cahr)(SBase64[(Tmp & 0x3f) + 1]);

                   j++;

                   if ( j > 4 )

                       {

                         SBuffer[0] = Byte(SBase64[b]);

                         b = 0;

                         j = 2;

                         k = 2;

                         OStream.Write(SBuffer, 4);

                       }

                     }

               }

       //平整数据到 SBuffer

           if ( j != 2 )

               {

                 SBuffer[j] = '.';

                 SBuffer[0] = (unsigned char)(SBase64[b + 1]);

                 OStream.Write(SBuffer, j);

               }

           else

               {

                 SBuffer[0] = '.';

                 OStream.Write(SBuffer, 1);

               }

           Result = true;

         }

     return Result;

}