【发布时间】:2011-11-22 18:25:23
【问题描述】:
这比我最初想象的要复杂一些。我正在尝试从流中读取 n 个字节。
Read 的MSDN claims 不必返回 n 个字节,它必须返回至少 1 到最多 n 个字节,其中 0 个字节是到达流末尾的特殊情况。
通常,我使用类似的东西
var buf = new byte[size];
var count = stream.Read (buf, 0, size);
if (count != size) {
buf = buf.Take (count).ToArray ();
}
yield return buf;
我希望精确到 size 字节,但根据规范 FileStream 也将被允许返回大量的 1 字节块。必须避免这种情况。
解决这个问题的一种方法是使用 2 个缓冲区,一个用于读取,一个用于收集块,直到我们获得请求的字节数。不过这有点麻烦。
我还查看了BinaryReader,但它的规范也没有明确说明肯定会返回 n 个字节。
澄清一下:当然,在流结束时返回的字节数可能小于size - 这不是问题。我只是在谈论不接收 n 字节,即使它们在流中可用。
【问题讨论】:
-
BinaryReader.ReadBytes(int)返回请求的字节数;如果流提前结束,它将返回它在该点之前读取的内容(因此少于请求)。 -
@bosonix 那会很方便。您有此信息的来源吗?
-
这是在MSDN页面msdn.microsoft.com/en-us/library/…中指定的,我也看了反汇编代码。
-
@bosonix 我明白了。那里说得很清楚,如果代码匹配,这似乎是最好的解决方案。我很困惑为什么我没有注意到该方法(显然在我提出这个问题时它是可用的),甚至 Marc Gravell 也没有建议它。