Форум: "Прочее";
Текущий архив: 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.54 MB
Время: 0.043 c