Estimados compañeros.
Tengo código para codificar un stream usando base64 y para decodificarlo. Usando el método TnxcxEncoding.TestDataEncoding se hace una codificación en base64 de un stream "controlado" (una cadena fija de solo erres) y el resultado, si el tamaño del stream es inferior a 256 bytes, es correcto, pero si es superior faltan caracteres en el stream resultante (comprobado con una utilidad externa). No le encuentro lógica alguna.
Si alguien tiene alguna idea será bienvenida.
Un cordial saludo y gracias de antemano.
El código es:
unit cEncodingDecoding;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
{ TnxcxEncoding }
TnxcxEncoding = class (TObject)
public
class function TestDataEncoding(): boolean;
class function StreamToBase64(aStream: TStream): string;
end;
{ TnxcxDecoding }
TnxcxDecoding = class (TObject)
public
class function TestDatadecoding(): boolean;
class function Base64ToStream(Base64: string; var aStream:
TStream): Boolean;
end;
implementation
uses base64, Forms, Clipbrd;{ TnxcxDecoding }
class function TnxcxDecoding.TestDatadecoding: boolean;
var
Texto: string;
TextoEncoded: string;
aStream: TStringStream;
Base64Str: string;
n: integer;
begin
Texto:='';
for n:=1 to 125840 do //257 do //125840 do
begin
Texto:=Texto+'r';
end;
TextoEncoded:='';
for n:=1 to 41946 do //257 do //125840 do
begin
TextoEncoded:=TextoEncoded+'cnJy';
end;
TextoEncoded:=TextoEncoded+'cnI=';
aStream:=TStringStream.Create(Texto);
try
Base64Str:=TnxcxEncoding.StreamToBase64(aStream);
Application.MessageBox(pchar(inttostr(Length(Base64Str))+LineEnding+LineEnding+inttostr(Length(TextoEncoded))),'');
Application.MessageBox(pchar(StringReplace(TextoEncoded,Base64Str,'',[])),'');
aStream.Position:=0;
aStream.Size:=0;
Base64ToStream(Base64Str,TStream(aStream));
Application.MessageBox(pchar(inttostr(Length(aStream.DataString))+LineEnding+LineEnding+inttostr(Length(Texto))),'');
Application.MessageBox(pchar(StringReplace(Texto,aStream.DataString,'',[])),'');
finally
aStream.Free;
end;
Application.MessageBox(pchar(inttostr(Length(DecodeStringBase64(EncodeStringBase64(Texto))))),'');
end;
class function TnxcxDecoding.Base64ToStream(Base64: string; var aStream:
TStream
): Boolean;
var
EncodedStream: TStringStream;
Base64Decoder: TBase64DecodingStream;
begin
Result:=False;
EncodedStream:=TStringStream.Create(Base64);
try
try
if EncodedStream.Size>0 then
begin
Base64Decoder:=TBase64DecodingStream.Create(EncodedStream);
try
aStream.CopyFrom(Base64Decoder,Base64Decoder.Size);
Result:=True;
finally
Base64Decoder.Free;
end;
end
else
begin
Result:=True;
end;
except
on e: Exception do
begin
exit;
end;
end;
finally
EncodedStream.Free;
end;
end;{ TnxcxEncoding }
class function TnxcxEncoding.TestDataEncoding: boolean;
begin
end;
class function TnxcxEncoding.StreamToBase64(aStream: TStream): string;
const
BUFFERSIZE=4096;
var
EncodedStream: TStringStream;
Base64Encoder: TBase64EncodingStream;
//aBuffer: array [0..BUFFERSIZE-1] of Byte;
//Leido: LongInt;
//TotalLeido: LongInt;
begin
Result:='';
EncodedStream:=TStringStream.Create('');
try
Base64Encoder:=TBase64EncodingStream.Create(EncodedStream);
try
//TotalLeido:=0;
//
//repeat
// Leido:=aStream.Read(aBuffer,BUFFERSIZE);
//
// if Leido>0 then
// begin
// TotalLeido:=TotalLeido+Leido;
//
// Base64Encoder.Write(aBuffer,Leido);
// end;
//until Leido<BUFFERSIZE;
Base64Encoder.CopyFrom(aStream,aStream.Size);
//Clipboard.AsText:=inttostr(aStream.Size)+' -
'+inttostr(Length(EncodedStream.DataString))+' (167788)';
Result:=EncodedStream.DataString;
finally
Base64Encoder.Free;
end;
finally
EncodedStream.Free;
end;
end;
end.