est-il possible de lancer en quelque sorte le type d'un pointeur créé par l'énoncé fixe ()?
C'est la situation: P>
J'ai un éventail d'octets, que je voudrais parcourir A travers, cependant, je voudrais que les valeurs soient traitées comme int, ayant donc un int * au lieu d'un octet *. p>
Voici quelques exemples de code: p>
byte[] rawdata = new byte[1024]; fixed(int* ptr = rawdata) //this fails with an implicit cast error { for(int i = idx; i < rawdata.Length; i++) { //do some work here } }
3 Réponses :
byte[] rawdata = new byte[1024]; fixed(byte* bptr = rawdata) { int* ptr=(int*)bptr; for(int i = idx; i < rawdata.Length; i++) { //do some work here } }
Vous ne bougeez pas votre pointeur, vous seriez probablement une bonne idée de montrer cela. Vous devriez également mentionner la différence de taille d'octet.
Je crois que vous devez aller via em> a Notez que lors de l'itération, vous devez utiliser octet * code>. Par exemple:
rawdata.length / 4 code>, pas
rawdata.length code> si vous êtes traiter votre réseau d'octets comme une séquence de valeurs 32 bits. p> p>
Quelle est la meilleure façon de traiter tous les octets restants avec l'arithmétique de pointeur qui ne se divisent pas uniformément en Tailleof (int) code>? (Par exemple, si le tableau d'octets était de 1023 octets longs.)
@QuickJoesmith: Je gérerais probablement ces pas i> avec un pointeur arithmétique, fondamentalement.
J'ai trouvé A - apparemment - plus élégant et pour une raison quelconque aussi aussi plus rapide de cela:
byte[] rawData = new byte[1024]; GCHandle rawDataHandle = GCHandle.Alloc(rawData, GCHandleType.Pinned); int* iPtr = (int*)rawDataHandle.AddrOfPinnedObject().ToPointer(); int length = rawData.Length / sizeof (int); for (int idx = 0; idx < length; idx++, iPtr++) { (*iPtr) = idx; Console.WriteLine("Value of integer at pointer position: {0}", (*iPtr)); } rawDataHandle.Free();
Pourquoi vous voulez utiliser des pointeurs en C #? Pour itérer sur ceci, vous pouvez utiliser simple utiliser
pour code> boucle.
D'accord. Bien que l'ajout de votre intention du démarrage aide à fournir des réponses et à éviter les questions :)