Я пишу какой-то код библиотеки, в котором есть byte[]
, который хранит некоторые данные в памяти. Я хотел бы предоставить некоторую часть byte[]
через объект Stream
потребителю библиотеки. Например, я хотел бы, чтобы открытые Stream
могли получить доступ к данным с позиции 50 до конца byte[]
. Открытый Stream
будет доступен для чтения и поиска, но не для записи.
Есть ли простой способ сделать это (надеюсь, без написания собственной Stream
реализации) без создания копии данных в памяти? Я пытался использовать новые Memory<T>
API, но не продвинулся очень далеко, потому что конструктор MemoryStream
не мог принимать параметр Memory<T>
, и кажется, что я не могу получить byte[]
из Memory<byte>
без копирования:
byte[] byteArray = new byte[100];
Memory<byte> memory = byteArray;
// Let's say I want to expose the second half of the byte[] via a Stream
var slicedMemory = memory.Slice(50);
// The only way to construct a MemoryStream from Memory<byte> is to call ToArray and get a byte[]
// But this makes a copy in memory, which I want to avoid
var stream = new MemoryStream(slicedMemory.ToArray(), false);
К вашему сведению, я использую .NET Core 3.1.
Вы можете просто использовать MemoryStream
- у него есть конструктор: MemoryStream(byte[] array, int index, int count)
который создаст неизменяемый поток над заданным массивом, начиная с запрошенного индекса и запрошенной длины.
А, я не заметил этого конструктора. Большое спасибо!