我知道,GetBuffer()
在C#/一个MemoryStream.NET必须小心使用,因为,作为文档描述了这里,有可能在年底未使用的字节,所以你必须要确保只在第一MemoryStream的期待缓冲区中的.Length字节.
但后来我遇到了一个案例,其中缓冲区开头的字节是垃圾!实际上,如果您使用像反射器这样的工具并查看ToArray()
,您可以看到:
public virtual byte[] ToArray()
{
byte[] dst = new byte[this._length - this._origin];
Buffer.InternalBlockCopy(this._buffer, this._origin, dst, 0,
this._length - this._origin);
return dst;
}
Run Code Online (Sandbox Code Playgroud)
所以要对返回的缓冲区做任何事情GetBuffer()
,你真的需要知道_origin.唯一的问题是_origin是私有的,没有办法实现它......
所以我的问题是-什么是使用GetBuffer()
在MemoryStream()
无将MemoryStream是如何构造的一些先验知识(这是什么套_origin)?
(正是这个构造函数,只有这个构造函数,设置原点 - 当你想要一个字节数组的MemoryStream从字节数组中的特定索引开始时:
public MemoryStream(byte[] buffer, int index, int count, bool writable, bool publiclyVisible)
Run Code Online (Sandbox Code Playgroud)
)
以下代码将始终抛出UnuthorizedAccessException(无法访问MemoryStream的内部缓冲区.)
byte[] buf1 = { 2, 3, 5, 7, 11 };
var ms = new MemoryStream(buf1);
byte[] buf2 = ms.GetBuffer(); // exception will be thrown here
Run Code Online (Sandbox Code Playgroud)
这是一个普通的旧控制台应用程序,我作为管理员运行.我无法想象我可以给出这个代码更具特权的设置.那么为什么我不能进入这个缓冲区呢?(如果没有人可以,GetBuffer方法有什么意义?)
MSDN文档说
要使用公共可见缓冲区创建MemoryStream实例,请使用MemoryStream,MemoryStream(array [],Int32,Int32,Boolean,Boolean)或MemoryStream(Int32).
我不这样做吗?
PS我不想使用ToArray(),因为它会复制.
从CString到char*,ReleaseBuffer()
必须在之后使用GetBuffer()
.但为什么?如果我不使用ReleaseBuffer()
后会发生什么GetBuffer()
?
有人能告诉我一个例子吗?谢谢.
我试图理解 GetBuffer() 函数。看起来它返回指向 CString 的指针,这在msdn GetBuffer() 中得到确认 。但是,我不明白msdn GetBuffer() 中显示的示例。
LPTSTR p = s.GetBuffer( 10 );
Run Code Online (Sandbox Code Playgroud)
里面是10有什么原因吗?谁能告诉我这个例子的输出?