Delphi 从EncdDecd解码Base64有限制吗?
您可以传入的Base64字符串的大小有限制吗 我正在使用下面的方法,当我的图像被创建时,它缺少底部的一部分。我看到BufferLen大约是44000,而DecodeBase64返回大约24000个项目的数组Delphi 从EncdDecd解码Base64有限制吗?,delphi,delphi-xe2,Delphi,Delphi Xe2,您可以传入的Base64字符串的大小有限制吗 我正在使用下面的方法,当我的图像被创建时,它缺少底部的一部分。我看到BufferLen大约是44000,而DecodeBase64返回大约24000个项目的数组 BufferLen := (Length(JVal) * 4) div 3; SetLength(PtrB, BufferLen); PtrB := DecodeBase64(AnsiString(JVal)); JStream := TStringStream.Create(PtrB);
BufferLen := (Length(JVal) * 4) div 3;
SetLength(PtrB, BufferLen);
PtrB := DecodeBase64(AnsiString(JVal));
JStream := TStringStream.Create(PtrB);
Jpeg := TJPEGImage.Create;
Jpeg.LoadFromStream(JStream);
Self.JPG := Jpeg;
Soap.EncdDecd单元中的代码没有大小限制,超出了使用
ansisting
数据类型所施加的限制
该程序成功地对100MB字符串进行编码和解码,证明了这一点:
{$APPTYPE CONSOLE}
uses
Soap.EncdDecd;
var
i: Integer;
plain, encoded: string;
begin
SetLength(plain, 100*1024*1024);
for i := 1 to Length(plain) do
plain[i] := Chr(32+Random(80));
encoded := EncodeString(plain);
if plain=DecodeString(encoded) then
Writeln('passed')
else
Writeln('failed');
Readln;
end.
您的问题几乎肯定在于您的代码,而不是EncdDecd
单元
您的代码可以简单一点。例如:
JStream := TBytesStream.Create(DecodeBase64(JVal));
Jpeg := TJPEGImage.Create;
Jpeg.LoadFromStream(JStream);
Soap.EncdDecd单元中的代码没有大小限制,超出了使用
ansisting
数据类型所施加的限制
该程序成功地对100MB字符串进行编码和解码,证明了这一点:
{$APPTYPE CONSOLE}
uses
Soap.EncdDecd;
var
i: Integer;
plain, encoded: string;
begin
SetLength(plain, 100*1024*1024);
for i := 1 to Length(plain) do
plain[i] := Chr(32+Random(80));
encoded := EncodeString(plain);
if plain=DecodeString(encoded) then
Writeln('passed')
else
Writeln('failed');
Readln;
end.
您的问题几乎肯定在于您的代码,而不是EncdDecd
单元
您的代码可以简单一点。例如:
JStream := TBytesStream.Create(DecodeBase64(JVal));
Jpeg := TJPEGImage.Create;
Jpeg.LoadFromStream(JStream);
哪个Delphi版本?由于AnsiString转换,推测>=2009。当您设置
PtrB
的长度时,您分配的字符串最终会被丢弃,而不会被使用。调用DecodeBase64
后,为该变量指定一个全新的值。这意味着您的BufferLen
计算也从未真正使用过。为什么Temp
在这个代码中?什么是JVal
,为什么需要将其类型转换为AnsiString
?Delphi XE2,我删除了Temp,因为这是为了调试oops!JVal是一个输入的字符串,编码为Base64,因此不必进行类型转换就可以了。为什么要使用DecodeBase64
而不是DecodeString
?设置长度的意义是什么?你可以简单地删除它。为什么要将TBytes
传递给字符串流呢。你是说tbytestream
?哪个Delphi版本?由于AnsiString转换,推测>=2009。当您设置PtrB
的长度时,您分配的字符串最终会被丢弃,而不会被使用。调用DecodeBase64
后,为该变量指定一个全新的值。这意味着您的BufferLen
计算也从未真正使用过。为什么Temp
在这个代码中?什么是JVal
,为什么需要将其类型转换为AnsiString
?Delphi XE2,我删除了Temp,因为这是为了调试oops!JVal是一个输入的字符串,编码为Base64,因此不必进行类型转换就可以了。为什么要使用DecodeBase64
而不是DecodeString
?设置长度的意义是什么?你可以简单地删除它。为什么要将TBytes
传递给字符串流呢。你是说tbytestream
?我想我找到了。我将编码更改为使用EncodeString而不是EncodeBase64,并传入字符串而不是ansistring。现在我的照片有了所有的数据。所以我倾向于认为这是AnsiString的局限性。我相信我找到了。我将编码更改为使用EncodeString而不是EncodeBase64,并传入字符串而不是ansistring。现在我的照片有了所有的数据。所以我倾向于认为这是AnsiString的局限性。