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 です。

どこかに余分なスペースを追加しています...私が間違っていることとして何か提案はありますか?

編集...

これは、c# から tcp を介して Delphi XE2 アプリに送信されるデータの base64 文字列の長さ = 400 です。

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

期待する長さを得るために 1 行追加できます。

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 に答える
1

何よりもまず、なぜ UTF-7 を使用しているのですか? Base64 は、ASCII 文字のみを使用する 7 ビットのエンコーディングです。base64 と UTF-7 の間の変換は不要な操作です。TBytesbase64 でエンコードされた文字オクテットを含むがある場合は、デコードをまったく行わず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);
于 2011-09-22T20:51:53.600 に答える