6

このリンクでは、Encoder.GetBytes メソッドについて説明しています。また、flush Explained という bool パラメータもあります。フラッシュの説明は次のとおりです。

このエンコーダーが変換の最後にその状態をフラッシュできる場合は true 。それ以外の場合は false。エンコードされたバイトのブロックのシーケンスを正しく終了させるために、GetBytes への最後の呼び出しでフラッシュに true の値を指定できます。

しかし、私はフラッシュが何をするのか理解していませんでした.多分私は酔っ払っているか何かです:)。詳しく教えてください。

4

3 に答える 3

6

ソケット接続を介してデータを受信するとします。byte[]いくつかのブロックとして長いテキストを受け取ります。

1 つの Unicode 文字が UTF-8 ストリームで 2 バイト以上を占め、2 バイト ブロックに分割される可能性があります。2 バイト ブロックを別々にエンコード (および文字列を連結) すると、エラーが発生します。

flush=trueしたがって、最後のブロックでのみ指定できます。もちろん、ブロックが 1 つしかない場合は、それも最後です。

ヒント: TextReader を使用して、この問題を処理させてください。

編集

ミラーの問題 (実際に尋ねられたもの: GetBytes) は、説明が少し難しいです。

の使用はafterflush=trueの使用と同じです。エンコーダーの「状態」をクリアし、Encoder.Reset()GetBytes(...)

一致しない上位サロゲートなど、前のデータ ブロックの末尾に末尾の文字を含める

基本的な考え方は同じです: からバイトのブロックに変換する場合string、またはその逆の場合、ブロックは独立していません。

于 2010-10-04T18:35:40.793 に答える
2

フラッシュすると、テキストをバイトにエンコードするために使用されるエンコーダー インスタンスの内部状態がリセットされます。なぜ内部状態が必要なのですか?MSDN を引用すると、次のようになります。

フラッシュ パラメータは、下位サロゲートを持たないストリームの最後で上位サロゲートをフラッシュする場合に役立ちます。たとえば、UTF8Encoding.GetEncoder によって作成されたエンコーダーは、このパラメーターを使用して、文字ブロックの末尾にぶら下がっている上位サロゲートを書き出すかどうかを決定します。

multiple を使用している場合はGetBytes()、終了が必要な文字シーケンスを終了するために最後に内部状態をフラッシュする必要がありますが、終了シーケンスは単語の途中で導入される可能性があるため、最後に のみ行う必要があります。

最近では、これは純粋に理論的な問題である可能性があることに注意してください。とにかく、より高レベルのラッパーを使用したほうがよいでしょう。そうすれば、酔っていても問題ありません。

于 2010-10-04T18:36:55.127 に答える
2

内部的にEncoderは、バッファを使用して実装されます。このバッファは、読み取りを正しく終了するかEncoder、次の読み取りの準備をするためにフラッシュ (クリア) する必要がある場合があります。

バッファ フラッシュの 1 つの説明を次に示します。

flushパラメータの正確な使用方法は、次のとおりです。

変換後にエンコーダーの内部状態をクリアする場合は true 。それ以外の場合は false。

于 2010-10-04T18:30:15.180 に答える