【问题标题】:Read MemoryStream into Byte[] chunk at a time for processing一次将 MemoryStream 读入 Byte[] 块进行处理
【发布时间】:2014-05-05 13:19:03
【问题描述】:

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

谢谢

【问题讨论】:

  • 对于MemoryStream 实例,流的内容已经占用RAM
  • 顺便说一句:将输出创建为新字节[strem.Length],然后直接通过分配 stream.ToArray() 的结果来删除它没有多大意义。你可以只写 byte[] output = stream.ToArray();

标签: c# memorystream


【解决方案1】:

您可以使用Read方法指定一个缓冲区并逐块读取:

byte[] block = new byte[16];
int bytesRead = stream.Read(block, 0, block.Length);

在上述示例中,bytesRead 包含在调用 Read 时读取的字节数。如果没有更多字节要读取,bytesRead 将为 0。

【讨论】:

    【解决方案2】:

    我不太明白您为什么要提取 MemoryStream 的部分内容以获取内存占用。 MemoryStream本身已经在内存中了,为什么要分块呢?

    如果调用ToArray,所有的内存都被复制了,那为什么不直接将输出写入一个新的(Memory)Stream呢?

    如果您想阅读流,请使用:

    stream.Position = 0; // go to beginning of stream
    
    byte[] buffer = new byte[16];
    while(stream.Read(buffer, 0, buffer.Length) > 0)
    {
        // process
    }
    

    【讨论】:

    • 本质上我正在研究一些新奇的加密和录制音频。音频被记录到内存流中,一旦全部记录下来,我需要将此信息传递给我的加密函数,一旦块被加密,我就会将其传回流并写入文件
    • 我发布了更新以包含实际读数。不要忘记像代码中那样转到流的开头!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 2018-05-19
      相关资源
      最近更新 更多