1

Python 2 (文字列は基本的にバイトのリスト) から変換されたアプリケーションがあり、文字列を便利なバイト バッファーとして使用しています。

このコードの一部を Boo 言語 (Python に似た構文、.NET で実行) で書き直しており、文字列には ASCII、UTF-8 などの固有のエンコーディング タイプがあることがわかりました。 bytes は (明らかに) 固定長のバイト配列を指し、扱いが非常に厄介です。

明らかに文字列からバイトを取得できますが、一部の文字を複数のバイトに拡張したり、127を超えるバイトを破棄/変更したりするリスクがあります。これは問題なく、この理由を完全に理解しています-しかし、私にとって何が便利でしょうか(a) 文字列を便利なバイト バッファーとして使用できるように、文字の変換または破棄を保証しないエンコーディング、または (b) 文字列クラスの利便性を提供するある種の ByteString クラスのいずれかです。(理想的には、後者の方がハックとは思えないためです。) これらのいずれかが既に存在しますか? (または、実装するのは簡単ですか?)

私は System.IO.MemoryStream を認識していますが、毎回それらのいずれかを作成し、最後に ReadToEnd() にアクセスするためだけに System.IO.StreamReader を作成する必要があるという見通しはあまり効率的ではないようです。これは、パフォーマンスが重要なコードにあります。

(答えがそこにも当てはまる可能性が高いと感じたので、これを C# としてタグ付けしたこと、および C# ユーザーが考えられる解決策について良い考えを持っていることを誰も気にしないことを願っています。)

編集: System.Text.StringBuilder も発見しました-再び、バイトにそのようなものはありますか?

4

2 に答える 2

4

この回答 で説明されているように、Latin-1 エンコーディングを使用します。128 ~ 255 の範囲の値を変更せずにマップします。バイトを char にラウンドトリップする場合に便利です。

アップデート

または、バイトを直接操作する場合は、次を使用しますList<byte>

List<byte> result = ...
...
// Add a byte at the end
result.Add(b);
// Add a collection of bytes at the end
byte[] bytesToAppend = ...
result.AddRange(bytesToAppend);
// Insert a collection of bytes at any position
byte[] bytesToInsert = ...
int insertIndex = ...
result.InsertRange(insertIndex, bytesToInsert);
// Remove a range of bytes
result.RemoveRange(index, count);
... etc ...

System.Text.StringBuilder も発見しました - 繰り返しますが、バイトにそのようなものはありますか?

StringBuilder通常の文字列は不変であり、List<byte>「バイト用の StringBuilder」に期待されるすべてのものを提供するため、このクラスが必要です。

于 2011-04-21T17:01:15.360 に答える
2

最終結果を取得するには、MemoryStream を GetBuffer() 演算子と組み合わせて使用​​することをお勧めします。文字列は実際には固定長で不変であり、文字列に 1 バイトを追加または置換するには、すべてを新しい文字列にコピーする必要があり、これは非常に時間がかかります。これを回避するには、メモリを割り当て、必要に応じて容量を 2 倍にする StringBuilder を使用する必要がありますが、代わりに MemoryStream を使用することもできます。

文字列の各要素は char であり、実際には 2 バイトです。これは、.NET 文字列がメモリ内で常に UTF-16 であるためです。つまり、各要素に 1 バイトだけを格納することにした場合も、メモリを浪費することになります。

于 2011-04-21T16:56:26.917 に答える