为什么BinaryReader.Read(byte [],int,int)依赖于编码?

时间:2017-08-09 20:02:15

标签: c# encoding binaryreader

documentation for System.IO.BinaryReader.Read(byte[], int, int)表示如果

,它可以抛出 ArgumentException
  

要读取的已解码字符数大于计数。如果Unicode解码器返回后备字符或代理项对,则会发生这种情况。

当我要求原始字节时,我根本不了解编码是如何发挥作用的。它会将基础流的字节解释为Unicode并跳过诸如字节顺序标记之类的东西吗?

即使它像代理对解析一样,最终会如何创建更多字节,而不是更少?

假设BinaryReader的编码不影响底层Stream,这是否意味着binaryReader.Read(..)和binaryReader.BaseStream.Read(..)从根本上不一样?它们在Mono's implementation of BinaryReader中似乎完全相同。解码器也不参与此功能的实现。

这只是MSDN文档中的复制/粘贴错误吗?

我问这一切的原因是因为我刚刚使用这个代码块遇到了ArgumentException,并且在两个记录的案例中可以抛出ArgumentException,它可能不是那么简单:

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
        ...
    }
}

1 个答案:

答案 0 :(得分:3)

  

这只是MSDN文档中的复制/粘贴错误吗?

可能的。根据参考源,字符编码不起作用。

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

  

我问这一切的原因是因为我刚用这个代码块和两个记录的可能抛出ArgumentException的案例遇到了ArgumentException。

如果ArgumentException太小, 会抛出buffer

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