我知道GetBuffer()
在 C#/.NET 中的 MemoryStream 上必须小心使用,因为正如这里的文档所述,最后可能有未使用的字节,所以你必须确保只查看第一个 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;
}
所以要对返回的缓冲区做任何事情GetBuffer()
,你真的需要知道_origin。唯一的问题是 _origin 是私有的,没有办法得到它......
所以我的问题是 - 如果没有GetBuffer()
关于MemoryStream()
MemoryStream 是如何构造的先验知识(这是什么设置 _origin),那么它有什么用?
(正是这个构造函数,并且只有这个构造函数,才能设置原点——因为当你想要一个围绕字节数组的 MemoryStream 时,该字节数组从字节数组中的特定索引开始:
public MemoryStream(byte[] buffer, int index, int count, bool writable, bool publiclyVisible)
)