Копирование данных между потоками в C#
Метод CopyTo переносит данные из текущей позиции источника в другой поток. Отдельный цикл чтения и записи для этого не нужен.
Если курсор уже сдвинут, в приёмник попадут только байты после него. Поэтому перед копированием позицию источника возвращают в начало.
Скопируем маленький буфер. CopyTo копирует от текущей позиции до конца, и приёмник получает столько байт, сколько ещё осталось в источнике:
using System.IO;
using MemoryStream source = new();
source.WriteByte(3);
source.WriteByte(4);
source.Position = 0;
using MemoryStream target = new();
source.CopyTo(target);
Console.WriteLine(target.Length); // выведет 2
Скопируйте поток в памяти с байтами 8, 1 и 6 в другой поток и выведите, сколько байт оказалось в приёмнике.