Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么BinaryReader.Read(字节[],int,int)依赖于编码?_C#_Encoding_Binaryreader - Fatal编程技术网

C# 为什么BinaryReader.Read(字节[],int,int)依赖于编码?

C# 为什么BinaryReader.Read(字节[],int,int)依赖于编码?,c#,encoding,binaryreader,C#,Encoding,Binaryreader,声明它可以在以下情况下抛出ArgumentException 要读取的解码字符数大于计数。如果Unicode解码器返回回退字符或代理项对,则可能发生这种情况 当我要求原始字节时,我根本不明白编码是如何起作用的。它会将底层流的字节解释为Unicode并跳过字节顺序标记之类的内容吗 即使它做了类似代理项对解析的事情,那怎么会产生比我要求的更多的字节,而不是更少的字节呢 假设BinaryReader的编码不影响底层流,这是否意味着BinaryReader.Read(..)和BinaryReader.B

声明它可以在以下情况下抛出ArgumentException

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

当我要求原始字节时,我根本不明白编码是如何起作用的。它会将底层流的字节解释为Unicode并跳过字节顺序标记之类的内容吗

即使它做了类似代理项对解析的事情,那怎么会产生比我要求的更多的字节,而不是更少的字节呢

假设BinaryReader的编码不影响底层流,这是否意味着BinaryReader.Read(..)和BinaryReader.BaseStream.Read(..)基本上是不同的?他们在这方面似乎完全一样。解码器也不参与此功能的实现

这仅仅是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
        ...
    }
}
这仅仅是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和消息吗?