2010-03-10 62 views
3

我有一個情況,我有一個Intptr,並且我有一個由4個字節組成的我自己的結構。我想從Intptr中讀取4個字節到我的這個結構中。但是我想單獨填充結構中的4個字節。像從Intptr讀取一個字節

mystruct obj = new mystruct()。

obj.byte2 = 「從Myintptr讀拳頭字節」
obj.byte1 = 「從MyIntptr讀取下一個字節」

這可能嗎?

其中一種方式可能是我首先使用Marshal.copy()將整個事物讀入一個字節數組,然後執行復制到obj的第二步。 但我好奇,我有另一種方式

+0

你想複製字節從內存指向的IntPtr的或該值的字節的IntPtr? – logicnp 2010-03-10 14:50:32

+0

另請注意,IntPtr在64位系統上是8個字節。 – logicnp 2010-03-10 14:51:04

回答

6

你在找這樣的事嗎?

obj.byte1 = System.Runtime.InteropServices.Marshal.ReadByte(ip, 0); 
obj.byte2 = System.Runtime.InteropServices.Marshal.ReadByte(ip, 1); 
+0

這將複製IntPtr指向的內存中的字節。 OP是否需要這個或IntPtr的實際「值」字節? – logicnp 2010-03-10 14:49:53

+0

我想讀取由IntPtr指向的值。這看起來像我想要的。我會嘗試它,並再次確認它的工作原理(目前卡住其他地方阻止進一步:() – mishal153 2010-03-10 15:06:36

0

如果該值在IntPtr中,則可以將ptr轉換爲Int32並選擇字節。 (請記住,IntPtr的將是8,而不是4個字節的64位系統上)

IntPtr ptr = ...; 
int val = (int)ptr; 
byte[] bytes = BitConverter.GetBytes(val); 

byte b1 = (byte)(val >> 24); 
byte b2 = (byte)(val >> 16); 
byte b3 = (byte)(val >> 8); 
byte b4 = (byte) val; 
+0

這是複製字節,或只是轉換指針嗎? – 2013-07-12 17:23:01

+0

int val =(int)ptr;將從指針複製值並將其分配給新的值類型結構。 – 2013-07-13 19:05:26