我正在将一个MemoryStream传递给一个函数 - 这可能最终会变得非常大。然后需要将其拆分为一个小字节[]进行处理,然后再添加回流中。在我之前的实现中,我大致有以下几点:
byte[] output = new byte[stream.Length];
output = stream.ToArray();
byte[] processingArray = new byte[16];
int index = 0;
int chunks = output / 16;
for(int i = 0; i < chunks; i++){
for(int x = 0; x < 16; x++){
processingArray[x] = output[x + index];
}
//do the processing on the array here
index += 16;
}
我想避免使用.ToArray(),因为这对我来说似乎是一种资源浪费。 我如何从内存流中一次提取16个字节,处理它然后抓取接下来的16个字节?
由于
答案 0 :(得分:1)
我不太明白为什么要为内存占用提取MemoryStream
的部分内容。 MemoryStream
本身已经在内存中,为什么要将它分成块?
如果你调用ToArray
所有内存都被复制了,为什么不直接将输出写入新的(内存)流?
如果您想阅读流,请使用此:
stream.Position = 0; // go to beginning of stream
byte[] buffer = new byte[16];
while(stream.Read(buffer, 0, buffer.Length) > 0)
{
// process
}
答案 1 :(得分:1)
您可以使用Read方法指定缓冲区并逐块读取:
byte[] block = new byte[16];
int bytesRead = stream.Read(block, 0, block.Length);
在上面的示例中,bytesRead
包含对Read
的调用中读取的字节数。如果没有更多字节要读取,bytesRead
将为0。
答案 2 :(得分:0)
GetBuffer()
将返回MemoryStream
正在使用的内部数组。这允许您绕过Read()
以制作有效的零拷贝解决方案:
MemoryStream ms;
byte[] buffer = ms.GetBuffer();
int offset = ms.Position;
int left = ms.Length - offset;
while(left != 0)
{
// process buffer starting at offset.
}