3

我在 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。

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

编辑...

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

TVpQAAIAAAAEAA8A//8AALgAAAAAAAAAQAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAALoQAA4ftAnNIbgBTM0hkJBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gdW5kZXIgV2luMzINCiQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABMAQgAGV5CKgAAAAAAAAAA4ACOgQsBAhkArAoAAMQCAAAAAAAwugoA

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

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

TVpQAAIAAAAEAA8A//8AALgAAAAAAAAAQAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAALoQAA4ftAnNIbgBTM0hkJBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gdW5kZXIgV2luMzINCiQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABMAQgAGV5CKgAAAAAAAAAA4ACOgQsBAhkArAoAAMQCAAAAAAAwugoA

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

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

TVpQAAIAAAAEAA8A//8AALgAAAAAAAAAQAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAALoQAA4ftAnNIbgBTM0hkJBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gdW5kZXIgV2luMzINCiQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABMAQgAGV5CKgAAAAAAAAAA4ACOgQsBAhkArAoAAMQCAAAAAAAwugoA

中间有 1 个额外的位,但我不知道它为什么会出现。

好心的建议我做错了什么。

4

3 回答 3

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;
于 2011-09-22T09:26:29.467 回答
2

虽然将 UTF7 编码与 Base64 解码混合使用是一个非常糟糕的主意,但您应该使用Soap.EncdDecd.pasEncodeBase64中的内置函数DecodeBase64

于 2011-09-22T09:17:31.540 回答
1

首先,为什么要涉及 UTF-7?Base64 是仅使用 ASCII 字符的 7 位编码。将 base64 转换为 UTF-7 是不必要的操作。如果您的 aTBytes包含 base64 编码的字符八位字节,那么您可以直接将其复制TBytes到 a中,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);
于 2011-09-22T20:51:53.600 回答