2017-08-09 11 views
0

documentation for System.IO.BinaryReader.Read(byte[], int, int)は読むためにデコードされた文字の数がカウントよりも大きいBinaryReader.Read(byte []、int、int)がエンコーディングに依存するのはなぜですか?

場合、それはArgumentExceptionがを投げることができると言います。これは、Unicodeデコーダがフォールバック文字またはサロゲートペアを返す場合に発生します。

生のバイトを要求しているときにエンコードがどのように再生されるかはわかりません。基礎となるストリームのバイトをUnicodeとして解釈し、バイトオーダーマークのようなものをスキップしますか?

サロゲートペアの解像度のような処理を行っても、最終的には私が求めたよりもバイト作成することになりますか?

BinaryReaderのエンコーディングが基本ストリームに影響しないと仮定すると、binaryReader.Read(..)とbinaryReader.BaseStream.Read(..)は基本的に同じではありませんか? Mono's implementation of BinaryReaderではまったく同じようです。デコーダは、この機能の実装にも関与していません。

これは単にMSDNドキュメントのコピー/ペーストエラーですか?

私はこのコードブロックとArgumentExceptionがに走ったので、私はこのすべてを求めている理由であり、ArgumentExceptionがスローを得る2つの文書の場合のそれは些細な1することはできません。

public void Foo(BinaryReader reader) 
{ 
    int bar = reader.ReadInt32(); 
    int baz = reader.ReadInt32(); 

    int bufferSize = 8192; 
    var buffer = new byte[bufferSize]; 

    int bytesRead = 0; 
    while ((bytesRead = reader.Read(buffer, 0, bufferSize)) != 0) 
    { 
     // do something with the read bytes here 
     ... 
    } 
} 
+0

は、* *「私はArgumentExceptionがに走った」 - あなたはエラー自体のより多くの情報を持っているために起こるのか?私はまさにユニコードとASCIIバイト配列をマージしていました。読み込み関数はうまくいきました。スタックトレースとメッセージを再現して表示できますか? – TyCobb

答えて

3

これは単にMSDNドキュメントのコピー/ペーストエラーですか?

と思われる。リファレンスソースによれば、文字エンコーディングは再生されません。

http://referencesource.microsoft.com/#mscorlib/system/io/binaryreader.cs,504

私はこのコードのブロックとし、ArgumentExceptionがスローにできる2つの文書化例ArgumentExceptionがに走ったので、私はこのすべてを求めている理由があります。

それはbufferが小さすぎるArgumentException場合投げるん:

if (buffer.Length - index < count) 
    throw ArgumentException(...); 
+0

OPは、「インデックス」として0を、そして「カウント」としてバッファのサイズを渡すので、些細なケースは起こらないと言っています。 – juharr

+2

OPは、エンコーディングの問題のために 'Read'のオーバーロードで' ArgumentException'がスローされるかどうかを尋ねています。私はリファレンスソースへのリンクを与えていますが、実際にはエンコーディングのためのことではありません。おそらくBinaryReaderが独自の読み込みで例外を投げた、基本的な 'Stream'でしょう。この時点で、それは推測ゲームです。 – vcsjones

関連する問題