2010-03-10 5 views
3

J'ai une situation où j'ai un Intptr, et j'ai une structure qui est de 4 octets. Je veux lire 4 octets de l'Intptr dans cette structure de la mienne. Mais je veux remplir les 4 octets dans la structure individuellement. quelque chose commeLire un octet d'Intptr

mystruct obj = nouveau mystruct().

obj.byte2 = "lire octet poing de Myintptr"
obj.byte1 = "lire l'octet suivant de MyIntptr"

est-ce possible? Un des moyens pourrait être que j'ai lu le tout dans un tableau d'octets tout d'abord en utilisant Marshal.copy(), puis faire la deuxième étape de la copie dans obj. Mais je suis curieux, il y a un autre moyen

+0

Voulez-vous copier octets de la mémoire pointée par le IntPtr ou les octets pour la valeur de l'IntPtr? – logicnp

+0

Notez également que IntPtr est de 8 octets sur les systèmes 64 bits. – logicnp

Répondre

6

Vous cherchez quelque chose comme ça?

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

Ceci copie les octets de la mémoire pointée par IntPtr. Est-ce que l'OP veut ceci ou les octets réels 'value' de l'IntPtr? – logicnp

+0

Je veux lire la valeur pointée par IntPtr. Cela ressemble à ce que je veux. Je vais essayer et reconfirmer que cela fonctionne (actuellement bloqué quelque part d'autre qui bloque toute progression supplémentaire :() – mishal153

0

Si la valeur est dans le IntPtr vous pouvez lancer le PTR à un Int32, et choisir les octets. (Rappelez-vous que IntPtr sera 8 et non 4 octets sur un système 64 bits)

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

ou

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

Est-ce que cette copie octets, ou simplement convertir le pointeur? –

+0

int val = (int) ptr; va copier la valeur du pointeur et l'assigner à une nouvelle structure de type de valeur. –

Questions connexes