Aloha的每个人, 我想知道如何将intptr的内存内容转换为其等效数据。 我应该忽略IntPtr的含义,我认为它是一个指向内存中某处的指针,例如一个字符串,我想得到那个字符串。有没有办法做到这一点?谢谢
答案 0 :(得分:5)
查看System.Runtime.InteropServices.Marshal
类(MSDN的超链接)。
有Copy
方法接受IntPtr
来源并将字符复制到char[]
数组中。将其转换为常规string
应该很容易。还有其他方法可以不同地解释内存内容;也就是说,您需要知道您正在查看的内存位置所期望的类型数据,然后您需要选择适当的Copy
重载。
话虽如此,IntPtr
实际上只是一个原生大小的整数(与Int32不同,它总是32位宽)。因此,它通常用在内存地址(指针)传递的地方的互操作场景中......因此,您可以在System.Runtime.InteropServices
命名空间中找到上述方法。
答案 1 :(得分:3)
通常,您可以使用Marshal.Copy,例如
IntPtr pointer = ...;
byte[] buffer = new byte[100];
Marshal.Copy(pointer, buffer, 0, buffer.Length);
从指定的内存地址检索100个字节到托管字节数组。
“字符串”是一个非常复杂的概念 - 字符串是什么样的?你事先知道它的长度吗?是零终止?你知道它的编码吗?等
答案 2 :(得分:1)
Marshal.PtrToStringAnsi和Marshal.PtrToStringUni。 Marshall类包含许多用于执行类似本机/托管编组任务的其他方法。