C# 为什么BinaryReader.Read(字节[],int,int)依赖于编码?
声明它可以在以下情况下抛出ArgumentException 要读取的解码字符数大于计数。如果Unicode解码器返回回退字符或代理项对,则可能发生这种情况 当我要求原始字节时,我根本不明白编码是如何起作用的。它会将底层流的字节解释为Unicode并跳过字节顺序标记之类的内容吗 即使它做了类似代理项对解析的事情,那怎么会产生比我要求的更多的字节,而不是更少的字节呢 假设BinaryReader的编码不影响底层流,这是否意味着BinaryReader.Read(..)和BinaryReader.BaseStream.Read(..)基本上是不同的?他们在这方面似乎完全一样。解码器也不参与此功能的实现 这仅仅是MSDN文档中的复制/粘贴错误吗 我问所有这些的原因是因为我刚刚用这段代码遇到了ArgumentException,在两个可以引发ArgumentException的文档案例中,它不可能是微不足道的一个:C# 为什么BinaryReader.Read(字节[],int,int)依赖于编码?,c#,encoding,binaryreader,C#,Encoding,Binaryreader,声明它可以在以下情况下抛出ArgumentException 要读取的解码字符数大于计数。如果Unicode解码器返回回退字符或代理项对,则可能发生这种情况 当我要求原始字节时,我根本不明白编码是如何起作用的。它会将底层流的字节解释为Unicode并跳过字节顺序标记之类的内容吗 即使它做了类似代理项对解析的事情,那怎么会产生比我要求的更多的字节,而不是更少的字节呢 假设BinaryReader的编码不影响底层流,这是否意味着BinaryReader.Read(..)和BinaryReader.B
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
...
}
}
这仅仅是MSDN文档中的复制/粘贴错误吗
很可能。根据参考资料来源,字符编码不起作用
我问所有这些的原因是因为我刚刚用这段代码遇到ArgumentException,以及两个可以引发ArgumentException的文档案例
如果缓冲区
太小,它会抛出ArgumentException
:
if (buffer.Length - index < count)
throw ArgumentException(...);
if(buffer.Length-index
这仅仅是MSDN文档中的复制/粘贴错误吗
很可能。根据参考资料来源,字符编码不起作用
我问所有这些的原因是因为我刚刚用这段代码遇到ArgumentException,以及两个可以引发ArgumentException的文档案例
如果缓冲区
太小,它会抛出ArgumentException
:
if (buffer.Length - index < count)
throw ArgumentException(...);
if(buffer.Length-index
OP表示不应该发生这种琐碎的情况,因为它们将0作为索引传递给,将缓冲区大小作为计数传递给。我给出了一个指向参考源的链接,表明它实际上并没有这样做。可能是BinaryReader的底层流
在其自身读取中引发了异常。在这一点上,这是一个猜测游戏。OP是说不应该发生这种琐碎的情况,因为它们将0作为索引
,将缓冲区的大小作为计数
。OP是问,由于编码问题,ArgumentException
是否可以在读取
的过载中抛出。我给出了一个指向参考源的链接,表明它实际上并没有这样做。可能是BinaryReader的底层流
在其自身读取中引发了异常。在这一点上,这是一个猜测游戏。“我刚刚遇到了ArgumentException”——您是否碰巧有关于错误本身的更多信息?我只是玩转了一下,甚至合并了Unicode和ASCII字节数组,Read
功能很好。你能重现并向我们展示stacktrace和消息吗?“我刚刚遇到ArgumentException”——你有关于错误本身的更多信息吗?我只是玩转了一下,甚至合并了Unicode和ASCII字节数组,Read
功能很好。你能复制并向我们展示stacktrace和消息吗?