Delphi 从EncdDecd解码Base64有限制吗?

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);

您可以传入的Base64字符串的大小有限制吗

我正在使用下面的方法,当我的图像被创建时,它缺少底部的一部分。我看到BufferLen大约是44000,而DecodeBase64返回大约24000个项目的数组

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的局限性。