为啥 MemoryStream.GetBuffer() 总是抛出?

Posted

技术标签:

【中文标题】为啥 MemoryStream.GetBuffer() 总是抛出?【英文标题】:Why does MemoryStream.GetBuffer() always throw?为什么 MemoryStream.GetBuffer() 总是抛出? 【发布时间】:2010-12-11 09:33:12 【问题描述】:

下面的代码总是会抛出 UnuthorizedAccessException(无法访问 MemoryStream 的内部缓冲区。)

byte[] buf1 =  2, 3, 5, 7, 11 ;
var ms = new MemoryStream(buf1);
byte[] buf2 = ms.GetBuffer();      // exception will be thrown here

这是在一个普通的旧控制台应用程序中,我以管理员身份运行。我无法想象我可以提供此代码的更多特权设置。那么为什么我不能到达这个缓冲区呢? (如果没有人可以,GetBuffer 方法的意义何在?)

MSDN 文档说

创建一个 MemoryStream 实例 一个公开可见的缓冲区,使用 记忆流, 内存流(数组 [],Int32, Int32、布尔值、布尔值),或 内存流(Int32)。

我不这样做吗?

附:我不想使用 ToArray(),因为这会产生副本。

【问题讨论】:

【参考方案1】:

Here 是您正在使用的 MemoryStream(byte[]) 构造函数的文档。它具体说:

此构造函数不公开底层流。 GetBuffer 抛出 UnauthorizedAccessException。

您应该使用 this 构造函数,而不是 publiclyVisible = true

【讨论】:

如果您不想指定构造函数的所有参数,只是为了获得publicVisible参数,您可以使用只有int32参数的参数,如@Dolphin的答案中所指定。 【参考方案2】:

查看MemoryStream.GetBuffer()的文档

创建一个 MemoryStream 实例 一个公开可见的缓冲区,使用 内存流,内存流(字节[], Int32、Int32、布尔值、布尔值),或 内存流(Int32)。如果当前 流可调整大小,对此进行两次调用 方法不返回相同的数组 if 底层字节数组被调整大小 通话之间。对于额外的 信息,请参阅容量。

您需要使用不同的构造函数。

【讨论】:

【参考方案3】:

添加到其他人已经放在这里的东西......

让您的代码工作的另一种方法是将您的代码更改为以下行。

byte[] buf2 = ms.ToArray();

【讨论】:

【参考方案4】:

您使用的MemoryStream(array[]) 似乎与文档中提到的三个版本中的任何一个都不匹配。

【讨论】:

以上是关于为啥 MemoryStream.GetBuffer() 总是抛出?的主要内容,如果未能解决你的问题,请参考以下文章

你应该同步运行方法吗?为啥或者为啥不?

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]