c# - 如何从 MemoryStream 中删除数据

标签 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);

虽然有效但效率不高。

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

谢谢

最佳答案

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

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

MemoryStream.GetBuffer() 可让您访问现有缓冲区,因此您无需创建新缓冲区即可移动字节。

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

关于c# - 如何从 MemoryStream 中删除数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5733696/

相关文章:

c# - SqlException:System.Data.SqlClient.SqlException (0x80131904)

c# - P-Invoke 解码分配在 DLL 中的结构数组

c# - 如何在另一个线程中访问 GUI 元素?

c# - 从 C# 中的巨大 MemoryStream 中读取

c# - 从位图流 C# 计算 MD5 的问题

c# - 为什么 Stream.Copy 比 Stream.Write 到 FileStream 快?

c# - 将对象序列化为 XML 以获取命名为字段值的标签列表

c# - 如何在 <script> _Layout.cshtml 中使用 properties.settings.default

c# - 如何在控制台应用程序关闭时调用方法?

.net - 哈希密码和 Entity Framework