.net - MemoryStream 上的 GetBuffer() 什么时候有用?

标签 .net memorystream getbuffer

我知道 GetBuffer()在 C#/.NET 中的 MemoryStream 上必须小心使用,因为正如文档所描述的 here ,最后可能有未使用的字节,因此您必须确保只查看缓冲区中的第一个 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 是私有(private)的,没有办法得到它......

所以我的问题是 - GetBuffer() 有什么用?在 MemoryStream()没有一些关于 MemoryStream 是如何构造的先验知识(这是什么设置 _origin)?

(正是这个构造函数,并且只有这个构造函数,才能设置原点——因为当你想要一个围绕字节数组的 MemoryStream 时,该字节数组从字节数组中的特定索引开始:
public MemoryStream(byte[] buffer, int index, int count, bool writable, bool publiclyVisible)

)

最佳答案

如果你真的想访问内部 _origin 值,你可以使用 MemoryStream.Seek(0, SeekOrigin.Begin) 调用。返回值将完全是 _origin 值。

关于.net - MemoryStream 上的 GetBuffer() 什么时候有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13053739/

相关文章:

c# - .NET COM 回调

c# - .NET如何在单独的类/表单上捕获预先捕获的异常

c# - 如何从 View 模型中弹出子窗口

.net - 使用FileStreamResult,如何关闭MemoryStream?

c# - 内存流到 sbyte[]

c# - Msbuild 无法通过间接引用 System.Runtime 构建网站项目

windows - 为什么 MemoryStream.GetBuffer() 总是抛出?

c++ - CString::GetBuffer() 示例

c# - 二维字节数组可以做成一个巨大的连续字节数组吗?