Как мне прочитать ровно n байтов из потока?

Это немного сложнее, чем я сначала предполагал. Пытаюсь прочитать 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 байтов, даже если они доступны в потоке.

9
задан mafu 22 September 2011 в 11:36
поделиться