DONTバイナリデータの場合はAnsiString
を使用してください。
AnsiString
は、バイナリデータ、特にXE7などのUnicode環境では適切なコンテナではありません。代わりにT(Id)Bytes
またはTMemoryStream
のような適切なバイトのコンテナを使用してください。 TId(Encoder|Decoder)MIME
文字列メソッドを介して、唯一UnicodeString
そのまま
あなたは、その暗黙のRTLのANSI AnsiString
を渡すことはできません< - > Unicode変換は、あなたのバイナリデータ破損している可能性があります。代わりにバイナリ指向のメソッドを使用してください((Encode|Decode)Bytes()
、(Encode|Decode)Stream()
)。彼らは理由のために存在します。言われていること
、インディ10は、追加のコピーを作成せずにAnsiString
を使用しなければならない(とあなたが本当にべきではありません)、あなたはTStream
インターフェイスでそれをラップすることができますので、もし、TIdMemoryBufferStream
クラス(のみデスクトッププラットフォーム)を持っていますメモリ内のデータのたとえば、次のように
var
Binary: AnsiString;
Strm: TIdMemoryBufferStream;
Base64: String;
begin
Binary := ...; // binary data
Strm := TIdMemoryBufferStream.Create(PAnsiChar(Binary), Length(Binary));
try
Base64 := TIdEncoderMIME.EncodeStream(Strm);
finally
Strm.Free;
end;
// use Base64 as needed...
end;
var
Base64: String;
Strm: TIdMemoryBufferStream;
Binary: AnsiString;
begin
Base64 := ...; // encoded data
SetLength(Binary, (Length(Base64) div 4) * 3);
Strm := TIdMemoryBufferStream.Create(PAnsiChar(Binary), Length(Binary));
try
TIdDecoderMIME.DecodeStream(Base64, Strm);
SetLength(Binary, Strm.Size);
SetCodePage(PRawByteString(@Binary)^, 28591, False);
finally
Strm.Free;
end;
// use Binary as needed...
end;
感謝。 TIDBytesを使用するようにコードを変換しました。できます。しかし、AnsiStringをバイナリデータの格納に使用しないでください。 AnsiStringはバイト配列よりも何もありません(まあ、ほとんど「何もない」)。あなたが文字列に変換しない限り、すべてがうまくいくはずです。 – Ampere
@mutex 'AnsiString'は単なるバイト配列以上のものです。これには関連するコードページもあり、AnsiStringを 'TIdEncoderMIME.EncodeString()'に渡すときのように、 'AnsiString'値を不注意に渡すときにバイナリデータの損失/破損を引き起こす可能性があります。また、あなたのコードをモバイルに移行する必要がある場合、 'AnsiString'は利用できません(サードパーティパッチなし) –