在.NET Core 3.1中,使用BinaryReader.ReadChars()方法读取字节数组中的字符时,读取的实际字符数可能会小于请求的字符数。这是因为该方法在读取下一个字符之前始终检查字符编码的前导字节,以便正确地解释正在读取的字节。但是,在.NET 6中,该方法将始终尝试读取请求的所有字符,即使在读取过程中遇到无效的前导字节。
为了解决这个问题,可以使用char[]作为缓冲区,并在读取期间跟踪缓冲区中已经读取的字符数。下面是一个代码示例:
using (BinaryReader reader = new BinaryReader(stream))
{
int charCount = 0;
char[] buffer = new char[1024];
while (charCount < requestedCharCount)
{
int charsRead = reader.Read(buffer, charCount, requestedCharCount - charCount);
if (charsRead == 0)
{
// EOF or error
break;
}
charCount += charsRead;
}
string result = new string(buffer, 0, charCount);
return result;
}
在这个示例中,我们使用一个while循环来持续读取字节流并将其解释为字符,直到达到请求的字符数或者遇到EOF或错误为止。我们使用char[]作为缓冲区,并在读取期间跟踪缓冲区中已经读取的字符数。最终,我们使用string的构造函数,将缓冲区中读取的字符转换为字符串并返回该字符串。