【问题标题】:How to remove data from a MemoryStream如何从 MemoryStream 中删除数据
【发布时间】:2011-04-20 16:39:16
【问题描述】:

我无法让它工作。我有一个 MemoryStream 对象。这节课 有一个 Position 属性,可以告诉您已读取了多少字节。

我要做的是删除0到Position-1之间的所有字节

我试过了:

MemoryStream ms = ...
ms.SetLength(ms.Length - ms.Position);

但有时我的数据会损坏。

所以我最终这样做了

MemoryStream ms = ...
byte[] rest = new byte[ms.Length - ms.Position];
ms.Read(rest, 0, (int)(ms.Length - ms.Position));
ms.Dispose();
ms = new MemoryStream();
ms.Write(rest, 0, rest.Length);

有效,但效率不高。

有什么想法可以让它发挥作用吗?

谢谢

【问题讨论】:

    标签: c# .net memorystream


    【解决方案1】:

    这应该比创建新缓冲区更有效并且效率更高:

    byte[] buf = ms.GetBuffer();            
    Buffer.BlockCopy(buf, numberOfBytesToRemove, buf, 0, (int)ms.Length - numberOfBytesToRemove);
    ms.SetLength(ms.Length - numberOfBytesToRemove);
    

    MemoryStream.GetBuffer() 让您可以访问现有缓冲区,因此您可以在不创建新缓冲区的情况下移动字节。

    当然,您需要小心越界问题。

    【讨论】:

      【解决方案2】:

      您不能从 MemoryStream 中删除数据 - 最简单的方法是根据您想要的数据创建一个新的内存流:

      MemoryStream ms = new MemoryStream(someData);
      //ms.Position changes here
      //...
      byte[] data = ms.ToArray().Skip((int)ms.Position).ToArray();
      ms = new MemoryStream(data);
      

      【讨论】:

      • 你确定吗?那么 SetLength 是做什么的呢?谢谢
      • @Moonlit - 您可以截断数据,但不能删除任意块,您需要以一种或另一种方式复制数据。话虽如此,我的代码并不比你的好(除了你依靠ms.Read() 复制所有字节)
      【解决方案3】:

      调用ms.SetLength(ms.Length - ms.Position) 不会删除0ms.Position-1 之间的字节,实际上它会删除ms.Length - ms.Positionms.Length 之间的字节。

      为什么不直接写:

      byte[] rest;
      ms.Write(rest, ms.Length-ms.Position, rest.Length);
      

      【讨论】:

      • 感谢对 SetLength 方法的解释
      【解决方案4】:
       var _ = new MemoryStream();
       _.Write(buf.GetBuffer(), (int)buf.Position, (int)buf.Length - (int)buf.Position);
       buf = _;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 2015-08-23
        相关资源
        最近更新 更多