一次将MemoryStream读入Byte []块进行处理

时间:2014-03-26 20:55:11

标签: c# memorystream

我正在将一个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个字节?

由于

3 个答案:

答案 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.
}