7
votes

C # Array d'octet sur Correction du pointeur d'int

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
    }
}


2 commentaires

Pourquoi vous voulez utiliser des pointeurs en C #? Pour itérer sur ceci, vous pouvez utiliser simple utiliser pour boucle.


D'accord. Bien que l'ajout de votre intention du démarrage aide à fournir des réponses et à éviter les questions :)


3 Réponses :


7
votes
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
    }
}

1 commentaires

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.



7
votes

Je crois que vous devez aller via a octet * . Par exemple: xxx

Notez que lors de l'itération, vous devez utiliser rawdata.length / 4 , pas rawdata.length si vous êtes traiter votre réseau d'octets comme une séquence de valeurs 32 bits.


2 commentaires

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) ? (Par exemple, si le tableau d'octets était de 1023 octets longs.)


@QuickJoesmith: Je gérerais probablement ces pas avec un pointeur arithmétique, fondamentalement.



2
votes

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();


0 commentaires