Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.29;
Скачать: CL | DM;

Вниз

Кодирование/декодирование Base64 MIME   Найти похожие ветки 

 
DDDeN   (2007-03-29 13:23) [0]

Здраствуйте! Подскажите компоненты для реализации кодирования/декодирования в Base64 MIME.


 
Rouse_ ©   (2007-03-30 09:26) [1]

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Unit Name : Base64.pas
//  * Purpose   : A Base64 encoding unit
//  * Author    : Alexander (Rouse_) Bagel
//  * Copyright : © Fangorn Wizards Lab 1998 - 2007.
//  * Version   : 1.01
//  * Home Page : http://rouse.drkb.ru
//  ****************************************************************************
//

unit Base64;

interface

uses
 SysUtils;

 function Base64Encode(const Value: String): String;
 function Base64Decode(const Value: String): String;

implementation

{ BUG DATA TEST
Test data.ghj
qwertyuiop[]\ghjghgghjj
asdfghjkl;"ghjfghhjghjghjghj
zxcvbnm,./jhtghjhj
1234567890-=ghjghj
}

const
 B64Table= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

function Base64Encode(const Value: String): String;
var
 I: Integer;
 InBuf: array[0..2] of Byte;
 OutBuf: array[0..3] of Char;
begin
 SetLength(Result, ((Length(Value) + 2) div 3) * 4);
 for I:= 1 to ((Length(Value) + 2) div 3) do
 begin
   if Length(Value)< (I * 3) then
     Move(Value[(I - 1) * 3 + 1], InBuf, Length(Value) - (I - 1) * 3)
   else
     Move(Value[(I - 1) * 3 + 1], InBuf, 3);
   OutBuf[0] := B64Table[((InBuf[0] and $FC) shr 2) + 1];
   OutBuf[1] := B64Table[(((InBuf[0] and $03) shl 4) or ((InBuf[1] and $F0) shr 4)) + 1];
   OutBuf[2] := B64Table[(((InBuf[1] and $0F) shl 2) or ((InBuf[2] and $C0) shr 6)) + 1];
   OutBuf[3] := B64Table[(InBuf[2] and $3F) + 1];
   Move(OutBuf,Result[(I - 1) * 4 + 1], 4);
 end;
 if (Length(Value) mod 3) = 1 then
 begin
   Result[Length(Result) - 1] := "=";
   Result[Length(Result)] := "=";
 end
 else
   if (Length(Value) mod 3) = 2 then
     Result[Length(Result)] := "=";
end;

function Base64Decode(const Value: String): String;

 procedure MorphValue(var Value: Byte);
 begin
   if (Value > 64) and (Value < 91) then
     Dec(Value, 65)
   else
     if (Value > 96) and (Value < 123) then
       Dec(Value, 71)
     else
       if (Value > 47) and (Value < 58) then
         Inc(Value, 4)
       else
         if Value = 43 then
           Value:= 62
         else
           Value:= 63;
 end;

var
 I: Integer;
 InBuf: array[0..3] of Byte;
 OutBuf: array[0..2] of Byte;
begin

 if (Length(Value) mod 4) <> 0 then
   raise Exception.Create("Base64: Incorrect string format");

 SetLength(Result,((Length(Value) div 4) - 1) * 3);
 for I := 1 to ((Length(Value) div 4) - 1) do
 begin
   Move(Value[(I - 1) * 4 + 1], InBuf, 4);

   MorphValue(InBuf[0]);
   MorphValue(InBuf[1]);
   MorphValue(InBuf[2]);
   MorphValue(InBuf[3]);

   OutBuf[0]:= (InBuf[0] shl 2) or ((InBuf[1] shr 4) and $03);
   OutBuf[1]:= (InBuf[1] shl 4) or ((InBuf[2] shr 2) and $0F);
   OutBuf[2]:= (InBuf[2] shl 6) or (InBuf[3] and $3F);

   Move(OutBuf,Result[(I - 1) * 3 + 1], 3);
 end;

 if Length(Value) <> 0 then
 begin
   Move(Value[Length(Value) - 3], InBuf, 4);
   if InBuf[2] = 61 then
   begin

     MorphValue(InBuf[0]);
     MorphValue(InBuf[1]);

     OutBuf[0]:= (InBuf[0] shl 2) or ((InBuf[1] shr 4) and $03);
     Result:= Result + Char(OutBuf[0]);

   end
   else
     if InBuf[3]= 61 then
     begin

       MorphValue(InBuf[0]);
       MorphValue(InBuf[1]);
       //MorphValue(InBuf[3]); <- BUG FIX
       MorphValue(InBuf[2]);

       OutBuf[0]:= (InBuf[0] shl 2) or ((InBuf[1] shr 4) and $03);
       OutBuf[1]:= (InBuf[1] shl 4) or ((InBuf[2] shr 2) and $0F);
       Result:= Result + char(OutBuf[0]) + char(OutBuf[1]);

     end
     else
     begin

       MorphValue(InBuf[0]);
       MorphValue(InBuf[1]);
       MorphValue(InBuf[2]);
       MorphValue(InBuf[3]);

       OutBuf[0]:= (InBuf[0] shl 2) or ((InBuf[1] shr 4) and $03);
       OutBuf[1]:= (InBuf[1] shl 4) or ((InBuf[2] shr 2) and $0F);
       OutBuf[2]:= (InBuf[2] shl 6) or (InBuf[3] and $3F);
       Result:= Result + Char(OutBuf[0]) + Char(OutBuf[1]) + Char(OutBuf[2]);

     end;
 end;
end;

end.


 
DVM ©   (2007-03-30 10:34) [2]

Вот мой вариант для памяти и файлов:


function EncodeBuffer(const Data: PChar; const DataLen: integer): string;

 function Encode_Byte(b: Byte): char;
 const
   Base64Code: string[64] =
     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 begin
   Result := Base64Code[(b and $3F) + 1];
 end;

var
 i: Integer;
begin
 i := 0;
 Result := "";
 while i <= DataLen - 1 do
 begin
   Result := Result + Encode_Byte(Byte(Data[i]) shr 2);
   Result := Result + Encode_Byte((Byte(Data[i]) shl 4) or (Byte(Data[i+1]) shr 4));
   if i+1 <= DataLen then
     Result := Result + Encode_Byte((Byte(Data[i+1]) shl 2) or (Byte(Data[i+2]) shr 6))
   else
     Result := Result + "=";
   if i+2 <= DataLen then
     Result := Result + Encode_Byte(Byte(Data[i+2]))
   else
     Result := Result + "=";
   Inc(i, 3);
 end;
end;

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

function EncodeFile(const FileName: string): string;
var
 hFile: THandle;
 dwSize, dwBytes: Cardinal;
 pData: PChar;
 dwPointer: DWord;
begin
 result := "";
 hFile := CreateFile(PChar(FileName), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 if hFile <> INVALID_HANDLE_VALUE then
   begin
     dwSize := GetFileSize(hFile, nil);
     dwPointer := SetFilePointer(hFile, 0, nil, FILE_BEGIN);
     if dwPointer <> $FFFFFFFF then
       begin
         GetMem(pData, dwSize + 1);
         try
           ZeroMemory(pData, dwSize + 1);
           if ReadFile(hFile, pData^, dwSize, dwBytes, nil) then
             begin
               Result := EncodeBuffer(pData, dwSize);
             end;
         finally
           FreeMem(pData, dwSize + 1);
         end;
       end;
     CloseHandle(hFile);
   end;
end;


 
Жуков Олег   (2007-03-30 10:55) [3]

Вот мой вариант для D7:

uses
 EncdDecd;

// функции DecodeString, EncodeString, DecodeStream, EncodeStream;

не знаю, есть ли в D5 этот модуль


 
Rouse_ ©   (2007-03-30 13:29) [4]


> Вот мой вариант для D7:
>
> uses
>  EncdDecd;

Хе... первый раз про этот юнит слышу, а оказывается есть такой :)


 
Ketmar ©   (2007-03-30 13:33) [5]

вот блин. надо проверить. неужто и вправду есть в стандартной поставке?!


 
umbra ©   (2007-03-30 13:36) [6]

таки есть :) сам удивился.


 
Ketmar ©   (2007-03-30 14:01) [7]

вот блин.

* Кэтмар торжественно вручил себе метлу *


 
RASkov   (2007-03-30 14:17) [8]

> [7] Ketmar ©   (30.03.07 14:01)

:)
Аплодисменты....
Это нормально.


 
Jeer ©   (2007-03-30 15:30) [9]

Появилось c D7


 
Sha ©   (2007-03-31 01:35) [10]

Тестируем при помощи этого:

procedure TForm1.Button1Click(Sender: TObject);
const
 no= 1024*64;
var
 s, t, r: string;
 i: integer;
 c: cardinal;
 sl1: TStringList;
 sl2: TStringList;
begin
 sleep(500); Application.ProcessMessages; sleep(500);
 sl1:=TStringList.Create;
 sl2:=TStringList.Create;

 for i:=0 to 255 do s:=s+chr(i);
 r:=EncdDecd.EncodeString(s);
 repeat
   i:=pos(#13#10,r);
   if i>0 then System.Delete(r,i,2);
   until i=0;

 c:=GetTickCount;
 for i:=1 to no do t:=EncdDecd.EncodeString(s);
 t:=r;
 sl1.Add(Format("%d  %d  %s",[GetTickCount-c,ord(t=r),"EncdDecd.EncodeString"]));
 sl2.Add(t+#13#10);

 c:=GetTickCount;
 for i:=1 to no do t:=Base64Rouse.Base64Encode(s);
 sl1.Add(Format("%d  %d  %s",[GetTickCount-c,ord(t=r),"Base64Rouse.Base64Encode"]));
 sl2.Add(t+#13#10);

 c:=GetTickCount;
 for i:=1 to no do t:=Base64DVM.EncodeBuffer(pointer(s),Length(s));
 sl1.Add(Format("%d  %d  %s",[GetTickCount-c,ord(t=r),"Base64DVM.EncodeBuffer"]));
 sl2.Add(t+#13#10);

 c:=GetTickCount;
 for i:=1 to no do t:=Sha_Strings.Sha_Base64Encode(s);
 sl1.Add(Format("%d  %d  %s",[GetTickCount-c,ord(t=r),"Sha_Strings.Sha_Base64Encode"]));
 sl2.Add(t+#13#10);

 c:=GetTickCount;
 for i:=1 to no do t:=EncdDecd.EncodeString(s);
 t:=r;
 sl1.Add(Format("%d  %d  %s",[GetTickCount-c,ord(t=r),"EncdDecd.EncodeString"]));
 sl2.Add(t+#13#10);

 Memo1.Lines.Text:=sl1.Text + #13#10 + sl2.Text;
 sl1.Free;
 sl2.Free;
end;


 
Sha ©   (2007-03-31 01:37) [11]

Результаты для АМД К6-2:

1883  1  EncdDecd.EncodeString
2283  0  Base64Rouse.Base64Encode
46547  0  Base64DVM.EncodeBuffer
531  1  Sha_Strings.Sha_Base64Encode
1682  1  EncdDecd.EncodeString

AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7 PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6 e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==

AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7 PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6 e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+//==

AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7 PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6 e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wA=

AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7 PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6 e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==

AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7 PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6 e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==



 
Sha ©   (2007-03-31 01:43) [12]

Забыл свой код выкусить. Вот он:
const
 Base64Nil = "=";
 Base64Encode: array [0..63] of char = (
   "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
   "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
   "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
   "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
   "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/");
 Base64Decode: array[0..255] of byte = (
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 64, 99, 99, 64, 99, 99, //"64" for #10,#13
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, //"99" for not Base64 codes
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 62, 99, 99, 99, 63, //"62" for "+", "63" for "/"
   52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 99, 99, 99, 99, 99, 99,
   99,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
   15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 99, 99, 99, 99, 99,
   99, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
   41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
   99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99);

// Sha_Base64Encode преобразует бинарную строку в Base64-строку.
function Sha_Base64Encode(const StringToEncode: string): string; overload;
var
 len, ch0, ch1: integer;
 p, q: pChar;
begin;
 p:=pointer(StringToEncode);
 len:=length(StringToEncode);
 ch0:=((len+2) div 3) * 4;
 Setlength(Result,ch0);
 if ch0>0 then begin;
   q:=pointer(Result);
   pInteger(@q[ch0-4])^:=ord(Base64Nil)*$01010101;
   repeat;
     ch0:=Ord(p[0]);
     q[0]:=Base64Encode[ch0 shr 2];
     ch0:=(ch0 and $03) shl 4;
     if len<=1 then
       q[1]:=Base64Encode[ch0]
     else begin;
       ch1:=Ord(p[1]);
       q[1]:=Base64Encode[ch0 + (ch1 shr 4)];
       ch1:=(ch1 and $0F); ch1:=ch1+ch1; ch1:=ch1+ch1;
       if len<=2 then
         q[2]:=Base64Encode[ch1]
       else begin;
         ch0:=Ord(p[2]);
         q[2]:=Base64Encode[ch1 + (ch0 shr 6)];
         q[3]:=Base64Encode[ch0 and $3F];
         end;
       end;
     len:=len-3;
     p:=p+3;
     q:=q+4;
     until len<=0;
   end;
 end;

// Sha_Base64Encode копирует (с преобразованием) данные из бинарного буфера
// в Base64-буфер.
function Sha_Base64Encode(BufToEncode, BufEncoded: pointer; LenToEncode: integer): integer; overload;
var
 ch0, ch1: integer;
 p, q: pChar;
begin;
 p:=BufToEncode;
 Result:=((LenToEncode+2) div 3) * 4;
 if Result>0 then begin;
   q:=BufEncoded;
   pInteger(@q[Result-4])^:=ord(Base64Nil)*$01010101;
   repeat;
     ch0:=Ord(p[0]);
     q[0]:=Base64Encode[ch0 shr 2];
     ch0:=(ch0 and $03) shl 4;
     if LenToEncode<=1 then
       q[1]:=Base64Encode[ch0]
     else begin;
       ch1:=Ord(p[1]);
       q[1]:=Base64Encode[ch0 + (ch1 shr 4)];
       ch1:=(ch1 and $0F); ch1:=ch1+ch1; ch1:=ch1+ch1;
       if LenToEncode<=2 then
         q[2]:=Base64Encode[ch1]
       else begin;
         ch0:=Ord(p[2]);
         q[2]:=Base64Encode[ch1 + (ch0 shr 6)];
         q[3]:=Base64Encode[ch0 and $3F];
         end;
       end;
     LenToEncode:=LenToEncode-3;
     p:=p+3;
     q:=q+4;
     until LenToEncode<=0;
   end;
 end;

// Sha_Base64Decode преобразует Base64-строку в бинарную строку.
function Sha_Base64Decode(const StringToDecode: string): string; overload;
type
 WordArray = array[0..$1fffffff] of word;
 pWordArray = ^WordArray;
var
 ch0, ch1: integer;
 p, q, terminator, lastdword: pChar;
label
 TestCrLf, Done, Error;
begin;
 ch0:=length(StringToDecode);
 if ch0>=4 then begin;
   SetLength(Result,ch0-(ch0 shr 2));
   p:=pointer(Result);
   q:=pointer(StringToDecode);
   terminator:=@q[ch0];
   lastdword:=@q[ch0-4];
   while true do begin;
     if q>lastdword then goto TestCrLf;
     ch0:=Base64Decode[ord(q[0])];
     if ch0>=64 then while true do begin;
       inc(q);
       if ch0>64 then goto Error;
TestCrLf:
       if q>=terminator then goto Done;
       ch0:=Base64Decode[ord(q[0])];
       if ch0<64 then begin;
          if q<=lastdword then break;
          if q>=terminator then goto Done;
          goto Error;
         end;
       end;

     ch1:=Base64Decode[ord(q[1])];
     if ch1>=64 then goto Error;
     p^:=chr((ch0 shl 2)+(ch1 shr 4)); inc(p);

     ch0:=pWordArray(q)[1];
     if ch0<>ord(Base64Nil)*(256+1) then begin;
       ch0:=Base64Decode[ch0 and 255];
       if ch0>=64 then goto Error;
       p^:=chr((ch1 shl 4)+(ch0 shr 2)); inc(p);

       ch1:=ord(q[3]);
       if ch1<>ord(Base64Nil) then begin;
         ch1:=Base64Decode[ch1];
         if ch1>=64 then goto Error;
         p^:=chr(ch0 shl 6 + ch1); inc(p);
         end;
       end;

     inc(q,4);
     end;
Done:
   SetLength(Result,p-pointer(Result));
   end
 else
Error:
   Result:="";
 end;

// Sha_Base64Decode копирует (с преобразованием) данные из Base64-буфера
// в бинарный буфер.
function Sha_Base64Decode(BufToDecode, BufDecoded: pointer; LenToDecode: integer): integer; overload;
type
 WordArray = array[0..$1fffffff] of word;
 pWordArray = ^WordArray;
var
 ch0, ch1: integer;
 p, q, terminator, lastdword: pChar;
label
 TestCrLf, Done, Error;
begin;
 if LenToDecode>=4 then begin;
   p:=BufDecoded;
   q:=pointer(BufToDecode);
   terminator:=@q[LenToDecode];
   lastdword:=@q[LenToDecode-4];
   while true do begin;
     if q>lastdword then goto TestCrLf;
     ch0:=Base64Decode[ord(q[0])];
     if ch0>=64 then while true do begin;
       inc(q);
       if ch0>64 then goto Error;
TestCrLf:
       if q>=terminator then goto Done;
       ch0:=Base64Decode[ord(q[0])];
       if ch0<64 then begin;
          if q<=lastdword then break;
          if q>=terminator then goto Done;
          goto Error;
         end;
       end;

     ch1:=Base64Decode[ord(q[1])];
     if ch1>=64 then goto Error;
     p^:=chr((ch0 shl 2)+(ch1 shr 4)); inc(p);

     ch0:=pWordArray(q)[1];
     if ch0<>ord(Base64Nil)*(256+1) then begin;
       ch0:=Base64Decode[ch0 and 255];
       if ch0>=64 then goto Error;
       p^:=chr((ch1 shl 4)+(ch0 shr 2)); inc(p);

       ch1:=ord(q[3]);
       if ch1<>ord(Base64Nil) then begin;
         ch1:=Base64Decode[ch1];
         if ch1>=64 then goto Error;
         p^:=chr(ch0 shl 6 + ch1); inc(p);
         end;
       end;

     inc(q,4);
     end;
Done:
   Result:=p-pChar(BufDecoded);
   end
 else
Error:
   Result:=0;
 end;


 
Sha ©   (2007-03-31 02:47) [13]

Результаты теста на скорость декодирования:

2924  1  EncdDecd.DecodeString
2614  1  Base64Rouse.Base64Decode
651  1  Sha_Strings.Sha_Base64Decode
2904  1  EncdDecd.DecodeString

Как видно, в этом случае все функции работают уже без ошибок,
однако, вариант от Rouse_ © не допускает #13#10 в строке.


 
Belorus ©   (2007-03-31 09:46) [14]

Это так глупо просить компонент кодирования/декодирования....  Тут не то что компонент , даже никакого класса не нужно.. Банально пару процедур....

Видимо автор начал изучать сразу Делфи, не начиная с паскаля, или какого нибудь интала/кумира.... А это вредно .... Опошляет восприятие...


 
DDDeN   (2007-03-31 20:21) [15]

Спасибо)
Да дело в том, что сталкнулся, а времени особо нет как всегда...

2Belorus
Ошибаетесь, занимаюсь уже 5 лет)
Бывает такое, что иногда сталкнешься и решить трудно сиюминутно.


 
Sha ©   (2007-03-31 21:46) [16]

Обнаружил, что вариант от Rouse_ ©
при кодировании строк длиной 12*n+7 (где n>=0)
читает символ 12*n+9 за памятью, выделенной строке.



Страницы: 1 вся ветка

Текущий архив: 2007.04.29;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.03 c
8-1155306409
Levabd
2006-08-11 18:26
2007.04.29
Mp3Теги


2-1175816300
Чайник
2007-04-06 03:38
2007.04.29
Что это: Unsatisfied forward or external declaration: P1202_AdsP


15-1175270067
BVZ_1
2007-03-30 19:54
2007.04.29
Что за компоненты


2-1175638237
SerJaNT
2007-04-04 02:10
2007.04.29
Удалить компонент


2-1176225263
Baffi
2007-04-10 21:14
2007.04.29
Отчет в Excel