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
...
}
}
答案 0 :(得分:3)
这只是MSDN文档中的复制/粘贴错误吗?
可能的。根据参考源,字符编码不起作用。
http://referencesource.microsoft.com/#mscorlib/system/io/binaryreader.cs,504
我问这一切的原因是因为我刚用这个代码块和两个记录的可能抛出ArgumentException的案例遇到了ArgumentException。
如果ArgumentException
太小, 会抛出buffer
:
if (buffer.Length - index < count)
throw ArgumentException(...);