解码base64会增加额外的空间

时间:2011-09-22 08:50:41

标签: delphi base64 decode delphi-xe2

我在Delphi XE2工作 我正在使用此

将base64字节数组转换为字符串
TEncoding.UTF7.GetString(byte1)

然后使用此函数将字符串解码为字节数组

function Base64Decode(const EncodedText: string): TBytes;
var
  DecodedStm: TBytesStream;
  Decoder: TIdDecoderMIME;
begin
  Decoder := TIdDecoderMIME.Create(nil);
  try
    DecodedStm := TBytesStream.Create;
    try
      Decoder.DecodeBegin(DecodedStm);
      Decoder.Decode(EncodedText);
      Decoder.DecodeEnd;
      Result := DecodedStm.Bytes;
    finally
      DecodedStm.Free;
    end;
  finally
    Decoder.Free;
  end;
end;

但输入字符串长度为400,解码后其字节数组长度为8192。

某处它正在添加额外的空间......任何建议都是我做错了什么?

编辑...

这是我的数据的base64从c#通过tcp发送到delphi XE2应用程序 字符串长度= 400

TVpQAAIAAAAEAA8A//8AALgAAAAAAAAAQAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAALoQAA4ftAnNIbgBTM0hkJBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gdW5kZXIgV2luMzINCiQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABMAQgAGV5CKgAAAAAAAAAA4ACOgQsBAhkArAoAAMQCAAAAAAAwugoA

当我将TBytes转换为字符串后,我在delphi应用程序中收到TBytes

Tbytes为UTF-7字符串 字符串长度= 401

TVpQAAIAAAAEAA8A//8AALgAAAAAAAAAQAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAALoQAA4ftAnNIbgBTM0hkJBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gdW5kZXIgV2luMzINCiQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABMAQgAGV5CKgAAAAAAAAAA4ACOgQsBAhkArAoAAMQCAAAAAAAwugoA

TByte为UTF-8字符串 字符串长度= 0(零)

TByte到ANSI字符串 字符串长度= 401

TVpQAAIAAAAEAA8A//8AALgAAAAAAAAAQAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAALoQAA4ftAnNIbgBTM0hkJBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gdW5kZXIgV2luMzINCiQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABMAQgAGV5CKgAAAAAAAAAA4ACOgQsBAhkArAoAAMQCAAAAAAAwugoA

之间有一个额外的位,但我不知道为什么会这样。

善意的建议我做错了什么。

3 个答案:

答案 0 :(得分:3)

您可以添加一行来获得您期望的长度:

function Base64Decode(const EncodedText: string): TBytes;
var
  DecodedStm: TBytesStream;
  Decoder: TIdDecoderMIME;
begin
  Decoder := TIdDecoderMIME.Create(nil);
  try
    DecodedStm := TBytesStream.Create;
    try
      Decoder.DecodeBegin(DecodedStm);
      Decoder.Decode(EncodedText);
      Decoder.DecodeEnd;
      Result := DecodedStm.Bytes;
      SetLength(Result, DecodedStm.Size);  // add this line
    finally
      DecodedStm.Free;
    end;
  finally
    Decoder.Free;
  end;
end;

答案 1 :(得分:2)

虽然将UTF7编码与Base64解码混合是一个非常糟糕的主意,但您应该使用 Soap.EncdDecd.pas EncodeBase64和DecodeBase64 >

答案 2 :(得分:1)

首先,你为什么要涉及UTF-7? Base64是一种仅使用ASCII字符的7位编码。将base64转换为UTF-7或从UTF-7转换是不必要的操作。如果您的TBytes包含base64编码的字符八位字节,那么您只需将TBytes直接复制到AnsiString而无需进行任何解码:

var
  byte1: TBytes;
  s: AnsiString;

SetString(s, PAnsiChar(byte1), Length(byte));

或使用Indy的BytesToStringRaw()功能:

var
  byte1: TBytes;
  s: String;

s := BytesToStringRaw(byte1);

无论哪种方式,只要您拥有base64编码的字符串,就可以使用Base64Decode()方法完全取消自定义TIdDecoderMIME.DecodeBytes()功能:

var
  decoded: TBytes;

decoded := TIdDecoderMIME.DecodeBytes(s);