Точное чтение ReadExactly в C#
Метод ReadExactly заполняет буфер целиком или завершается ошибкой - контракт «ровно N байт» без цикла.
Это удобно для заголовков фиксированной длины и бинарных полей, где неполное чтение ломает разбор.
Сравним обычный Read и точное чтение на одном буфере. Read возвращает число байтов, а ReadExactly заполняет буфер и бросает EndOfStreamException, только если данных не хватило. Здесь хватает: первый вызов возвращает 2, сумма двух первых байтов равна 48:
using System.IO;
using MemoryStream stream = new();
stream.Write([0x10, 0x20, 0x30]);
stream.Position = 0;
byte[] head = new byte[2];
Console.WriteLine(stream.Read(head, 0, head.Length)); // выведет 2
stream.Position = 0;
stream.ReadExactly(head);
Console.WriteLine(head[0] + head[1]); // выведет 48
В потоке шесть байт; прочитайте ровно 4 байта заголовка и выведите пятый байт потока как число.