Это немного сложнее, чем я сначала предполагал. Пытаюсь прочитать n байтов из потока.
MSDN утверждает , что Read не обязательно должен возвращать 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;
. Я надеюсь на размер байт
байт, но согласно спецификации FileStream также может возвращать большое количество однобайтовых блоков. Этого нужно избегать.
Один из способов решить эту проблему - иметь 2 буфера, один для чтения, а другой для сбора фрагментов, пока мы не получим требуемое количество байтов. Хотя это немного громоздко.
Я также посмотрел на BinaryReader , но в его спецификации также четко не указано, что n байтов будут возвращены обязательно.
Для пояснения: Конечно, по окончании потока возвращаемое количество байтов может быть меньше размера
- это не проблема. Я говорю только о неполучении n байтов, даже если они доступны в потоке.