LEM*_*LEM 6 .net c# memorystream
我不能让这个工作.我有一个MemoryStream对象.此类有一个Position属性,可以告诉您已读取的字节数.
我想要做的是删除0和位置1之间的所有字节
我试过这个:
MemoryStream ms = ...
ms.SetLength(ms.Length - ms.Position);
Run Code Online (Sandbox Code Playgroud)
但在某些时候我的数据被破坏了.
所以我最终做到了这一点
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);
Run Code Online (Sandbox Code Playgroud)
哪个有效,但效率不高.
任何想法我怎么能让这个工作?
谢谢
ese*_*elk 11
这应该工作并且比创建新缓冲区更有效:
byte[] buf = ms.GetBuffer();
Buffer.BlockCopy(buf, numberOfBytesToRemove, buf, 0, (int)ms.Length - numberOfBytesToRemove);
ms.SetLength(ms.Length - numberOfBytesToRemove);
Run Code Online (Sandbox Code Playgroud)
MemoryStream.GetBuffer()允许您访问现有缓冲区,因此您可以在不创建新缓冲区的情况下移动字节.
当然,你需要小心越界问题.
您无法从中删除数据MemoryStream- 最干净的是根据您想要的数据创建新的内存流:
MemoryStream ms = new MemoryStream(someData);
//ms.Position changes here
//...
byte[] data = ms.ToArray().Skip((int)ms.Position).ToArray();
ms = new MemoryStream(data);
Run Code Online (Sandbox Code Playgroud)
呼叫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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20556 次 |
| 最近记录: |