如何从MemoryStream中删除数据

时间:2011-04-20 16:39:17

标签: c# .net memorystream

我无法让这个工作。我有一个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);

有效,但效率不高。

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

由于

4 个答案:

答案 0 :(得分:8)

这应该比创建新缓冲区更有效:

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

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

当然,你需要注意越界问题。

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

调用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);

答案 3 :(得分:0)

 var _ = new MemoryStream();
 _.Write(buf.GetBuffer(), (int)buf.Position, (int)buf.Length - (int)buf.Position);
 buf = _;