我无法让这个工作。我有一个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);
有效,但效率不高。
我有什么想法可以让它发挥作用吗?
由于
答案 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)
不会删除0
和ms.Position-1
之间的字节,实际上它会删除ms.Length - ms.Position
和ms.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 = _;