2017-10-09 19 views
0

バイナリデータを格納するために使用するAnsi文字列があります。バイトは0-255の範囲です(バイト配列などであるはずですが、それほど違いはありません)。
Indy MIME(TIdEncoderMIME.EncodeString/TIdDecoderMIME.DecodeString)を介してこの "バイナリ文字列"を渡し、人間が読めるANSI文字列を取得します。Indy Mimeでバイナリデータをエンコードするには?

私は、IndyTextEncoding_8Bitエンコーディングを使用すると、Encode/DecodeStringの出力がANSI文字のみの文字列になると考えました。しかし、私は間違っていました!

Indy Mime(バイナリデータをapplication/octet-streamと似ています)でエンコードする方法はありますか?

答えて

4

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; 
+0

感謝。 TIDBytesを使用するようにコードを変換しました。できます。しかし、AnsiStringをバイナリデータの格納に使用しないでください。 AnsiStringはバイト配列よりも何もありません(まあ、ほとんど「何もない」)。あなたが文字列に変換しない限り、すべてがうまくいくはずです。 – Ampere

+0

@mutex 'AnsiString'は単なるバイト配列以上のものです。これには関連するコードページもあり、AnsiStringを 'TIdEncoderMIME.EncodeString()'に渡すときのように、 'AnsiString'値を不注意に渡すときにバイナリデータの損失/破損を引き起こす可能性があります。また、あなたのコードをモバイルに移行する必要がある場合、 'AnsiString'は利用できません(サードパーティパッチなし) –

関連する問題