gpt4 book ai didi

C# BinaryReader.ReadChar 读取 NetworkStream 时抛出 "System.ArgumentException: The output char buffer is too small"

转载 作者:太空狗 更新时间:2023-10-29 23:15:32 24 4
gpt4 key购买 nike

当读取 C# NetworkStream(从流型 TCP 套接字)时,BinaryReader.ReadChar 偶尔会抛出异常 System.ArgumentException: The output char buffer is too small包含解码后的字符,编码为“Unicode (UTF-8)”

所有缓冲区都有它们的默认大小(没有一个是手动设置的)并且设置更大的缓冲区大小不会影响问题。

什么是完全令人沮丧的:

  • 调用ReadChar调用断点逐行执行时不会出现异常

  • 如果 ReadChar 前面有 Thread.Sleep(1000),则不会发生异常(但仍可能发生较小的超时)

  • FileStream 上使用 BinaryReader 时不会发生异常,其中存储了 TCP 服务器应答的所有精确字节。

那么,从套接字流中缓冲单个字符的时间相关问题是什么?

最佳答案

我也有这个问题。这里有一些关于它的事实:

  1. System.ArgumentException: The output char buffer is too small to contain the decoded characters, encoding 'Unicode (UTF-8)' 已知与 UTF-8 编码问题有关(无效字符代码)而不是缓冲问题 - Detials here

  2. NetworkStream(Read 和其他方法)已知仅返回系统网络缓冲区中已存在的字节数,而不是阻塞直到所有请求将收到数据 - Details here .因此,需要在循环中使用 Read 来获取所有请求的数据

  3. 众所周知,
  4. BinaryReader 在从 NetworkStream 获取的数据少于预期时会抛出异常,而不是使用循环来检索其余数据(是的,我敢肯定,这意味着一个错误!) - Details here

因此,我的解决方案是部分重新实现 BinaryReader(我将我的类命名为 BinReader),添加一些有用的功能并使用循环创建正确的 Read 方法:

public int Read( byte[] buf, int off, int count ) {
int read = 0;
while( read < count ) {
int toread = count - read;
int portion = BaseStream.Read( buf, off, toread );
read += portion;
off += portion;
}
return read;
}

这已经为我解决了。

关于C# BinaryReader.ReadChar 读取 NetworkStream 时抛出 "System.ArgumentException: The output char buffer is too small",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18530568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com