2011-08-29 88 views
1

Aloha-everyone, 我想知道如何將intptr的內存內容轉換爲其等效數據。 我應該錯過IntPtr的含義,我認爲它是一個指向內存中某個地方的指針,例如一個字符串,我想獲取該字符串。有沒有辦法做到這一點?謝謝從intptr複製內存內容

+1

** 1。** _「將內存內容轉換爲其等效數據」_沒有任何意義。內存內容可以用無數種方式解釋 - 你需要知道它代表什麼(即你需要知道它的數據類型)。 ** 2。**一個'IntPtr'只是一個本地大小的整數(不像例如'Int32',它總是32位寬)。因此,在互操作場景中,它經常用於內存地址(指針)傳遞的地方。 – stakx

回答

5

看看System.Runtime.InteropServices.Marshal類(超鏈接到MSDN)。

有一種Copy方法接受IntPtr源並將字符複製到char[]陣列中。應該很容易將其轉換爲常規的string。還有其他方法可以不同地解釋存儲器內容;也就是說,您需要知道類型您所期望的數據在您正在查看的內存位置,然後您需要選擇適當的過載Copy

這就是說,IntPtr實際上只是一個本地大小的整數(不像Int32,它總是32位寬)。因此,它經常被用在內存地址(指針)周圍的互操作場景中......因此您可以在System.Runtime.InteropServices名稱空間中找到上述方法。

3

一般情況下,您可以使用Marshal.Copy

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

它從指定的內存地址檢索100字節到託管字節數組。

「一串」是一個非常複雜的概念 - 什麼樣的的字符串?你事先知道它的長度嗎?它是零終止的嗎?你知道它的編碼嗎?等等