如何从MemoryStream中删除数据

我不能让这个工作。 我有一个MemoryStream对象。 此类有一个Position属性,可以告诉您已读取的字节数。

我想要做的是删除0和位置-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); 

哪个有效,但效率不高。

任何想法我怎么能让这个工作?

谢谢

您无法从MemoryStream删除数据 – 最干净的是根据您想要的数据创建新的内存流:

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

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

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

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

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

调用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); 
  var _ = new MemoryStream(); _.Write(buf.GetBuffer(), (int)buf.Position, (int)buf.Length - (int)buf.Position); buf = _;