1

簡単な質問があります。

AnsiString をバイナリ データのコンテナーとして使用したいと考えています。私はほとんどの場合、TMemoryStream または TFileStream からそのようなデータをロードし、いくつかの処理後に AnsiString から保存します。正常に動作し、問題は見つかりませんでした。

しかし、私が見たところ、そのように使用することで、Sysutils::TBytes代わりに使用する議論が巻き起こっています。なんで?Sysutils::TBytesたとえば、内部に格納されているデータを操作するために使用できる便利なメソッドははるかに少ないですAnsiString。AnsiString と比較すると、明らかに中途半端なコンテナーです。

通常の文字列への変換について気にする必要がある唯一の問題ですか、それとも適切でないものを実際に使用する必要がある他の何かがありますTBytesか? AnsiString を他の文字列型に変換することはしません。これは、別の場所で考えられる問題として引用されていることです。

データをロードする方法の例:

AnsiString data;
boost::scoped_ptr<TFileStream> fs(new TFileStream(FileName, fmOpenRead | fmShareDenyWrite));
data.SetLength(fs->Size);
fs->Read(data.c_str(), fs->Size);

データを保存する方法の例:

// fs wants void * so I have to use data.data() instead of data.c_str() here
fs->Write(data.data(), data.Length());

では、バイナリデータを正しく保存しても安全でしょうか?

4

1 に答える 1

4

AnsiString をバイナリ データのコンテナーとして使用したいと考えています。

一言-しないでください!それはいつかあなたを噛むでしょう。、 、 などTBytes、より適切なコンテナを使用してください。TMemoryStreamstd::vector<byte>

正常に動作し、問題は見つかりませんでした。

自分は幸運だと考えてください。C++Builder 2009 以降でAnsiStringは、コードページに対応しており、渡すときに非常に注意しないと、データ変換が発生しますAnsiString。遅かれ早かれ、失敗する可能性があり、バイナリ データが破損する危険があります。

しかし、私が見た限りでは、代わりに Sysutils::TBytes を使用する議論が巻き起こっています。なんで?

これは、生のバイト専用の実際の生のバイナリ コンテナーであるためです。

Sysutils::TBytes には、AnsiString などの内部に格納されたデータを操作するために使用できる便利なメソッドがほとんどありません。

そもそもバイナリ データをテキストとして操作するべきではありません。また、Boost や STL などを使用しているため、代わりにそれらのバイナリ コンテナーを使用することを検討する必要があります。より多くの機能を利用できます。

そうは言っても、XE7 では、挿入、削除、連結など、Delphi スタイルの動的配列(TByte など)を操作するための新しい関数がいくつか導入されています。

動的配列でサポートされる文字列のような操作

ただし、これらの新しい関数が C++Builder のDynamicArrayクラス ( of でTBytesあるtypedef) に組み込まれたようには見えません。

AnsiString と比較すると、明らかに中途半端なコンテナーです。

AnsiStringテキスト文字のコンテナです。限目。これまでも、これからも。という事実を利用して、人々はそれを乱用しsizeof(char)==sizeof(byte)ます。それはある程度まで機能しましたが、近年、それを乱用し続けることは危険になっています.

通常の文字列への変換について気にする必要がある唯一の問題はありますか?それとも、代わりに適切ではないTBytesを実際に使用する必要がある理由が他にありますか?

それと、Embarcadero が 2009 年以降段階的に廃止されているという事実ですAnsiString。モバイル コンパイラでは 8 ビット文字列が無効になっています。デスクトップ コンパイラがこれに追随するのは時間の問題です。

そもそも生のバイトを文字列として操作したいのはなぜですか? できて、できないことの例を教えAnsiStringてくださいTBytes

では、バイナリデータを正しく保存しても安全でしょうか?

あなたの特定の例では、はい(そして、はい、呼び出すときc_str()に代わりに使用できます)。data()fs->Write()

于 2014-09-23T01:38:36.367 に答える