2010-06-07 6 views
2

Voici un code emprunté au moteur "Endogine". Il est censé échanger l'ordre des octets d'un tableau d'octets:Rendre ce code C# SwapBytes compatible x64

unsafe protected void SwapBytes(byte* ptr, int nLength) 
{ 
    for(long i = 0; i < nLength/2; ++i) { 
     byte t = *(ptr + i); 
     *(ptr + i) = *(ptr + nLength - i - 1); 
     *(ptr + nLength - i - 1) = t; 
    } 
} 

Il semble échouer lorsque je cible l'architecture x64, mais je ne peux pas comprendre pourquoi, car aucun pointeur est jeté à int32. Toute aide?

+0

Avez-vous essayé d'utiliser un type int pour nLength et i? Aussi, quelle est l'erreur que vous obtenez? – Sijin

+0

si vous pouviez exécuter une séquence spécifique d'octets (par exemple, 0x01, 0x02, 0x03, 0x04) à la fois x86 et x64 et afficher les résultats ne correspondant pas, cela aiderait. –

Répondre

1

De quelle façon cela semble-t-il échouer? Cela semble assez simple. J'utilise deux pointeurs pour le rendre un peu plus vite:

unsafe protected void SwapBytes(byte* ptr, int nLength) { 
    byte* ptr2 = ptr + nLength - 1; 
    for(int i = 0; i < nLength/2; i++) { 
    byte t = *ptr; 
    *ptr = *ptr2; 
    *ptr2 = t; 
    ptr++; 
    ptr2--; 
    } 
} 

Cependant, le compilateur est assez bonne à optimiser les boucles et les accès réseau. Il est probable que le code managé pour faire de même effectue assez proche du code non sécurisé:

protected void SwapBytes(byte[] data) { 
    for(int i = 0, j = data.Length - 1; i < data.Length/2; i++, j--) { 
    byte t = data[i]; 
    data[i] = data[j]; 
    data[j] = t; 
    } 
}