Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Вниз

Кодирование/декодирование 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.042 c
15-1175434312
Cyrax
2007-04-01 17:31
2007.04.29
Photoshop: несколько надписей на одном текстовом слое...


15-1175518945
Kerk
2007-04-02 17:02
2007.04.29
Вопрос линуксоидам


3-1171277582
petvv
2007-02-12 13:53
2007.04.29
insert into <....> select <...> union select <...> = грабли


1-1172815571
Бригадир
2007-03-02 09:06
2007.04.29
Собственная отрисовка PopupMenu


2-1176237348
ppcumax
2007-04-11 00:35
2007.04.29
Как сделать паузу в цикле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский