将指针转换为 MemoryStream?

Posted

技术标签:

【中文标题】将指针转换为 MemoryStream?【英文标题】:Converting a pointer into a MemoryStream? 【发布时间】:2012-07-26 00:22:49 【问题描述】:

我正在尝试从剪贴板中获取 设备独立位图。我很清楚这可以通过 .NET Framework 中内置的 Clipboard.GetData 函数来完成,但由于它非常有问题(如网络上的许多地方所记录的那样),我只想使用 API。

我编写了以下有效的代码。

//i can correctly cast this to a MemoryStream
MemoryStream ms = Clipboard.GetData("DeviceIndependentBitmap") as MemoryStream;

但我想将它与 API 一起使用,它只是返回一个以某种方式指向流的指针(一个 IntPtr)。我看了一下UnmanagedMemoryStream,但不明白如何正确地将IntPtr 转换成那个。

这是我的 API 代码(使用 GetClipboardData API,其中 CF_DIB 格式设置为参数)。

IntPtr p = GetClipboardData(8);
//what do I do from here to get a MemoryStream from this pointer?

我有点困惑。我自己已经研究过了,但想不出有用的东西。

【问题讨论】:

【参考方案1】:

正如您所说,您可以使用UnmanagedMemoryStream(byte* pointer, long length) 并使用它,您应该有一个指针和字节的长度。所以你可以使用IntPtr.ToPointer()方法来获取指针,但是你应该知道内存内容的长度。

UnmanagedMemoryStream unmanagedmemstream = UnmanagedMemoryStream(p.ToPointer(), 100);

还有另一种检索字节数组的方法,但在这里你应该知道你想要的内存字节的长度,它是Marshal.Copy(IntPtr source, byte[] destination, int startIndex,int length)

byte[] buffer = new byte[100];
Marshal.Copy(p , buffer, 0, buffer.Length);

【讨论】:

以上是关于将指针转换为 MemoryStream?的主要内容,如果未能解决你的问题,请参考以下文章

将 XDocument 转换为流

在 .net 核心中将 MailMessage 转换为 MemoryStream

c# 将 system.IO.Stream 转换为 Byte[] [重复]

memorystream - 字符串流,字符串,其他?

独立项目-MemoryStream-内存数据读写-01

Image与byte[]数组的相互转换