Question

Je veux comparer les parties de byte[] efficacement - si je comprends memcmp() doit être utilisé

.

Je sais que je peux appeler à l'aide PInvoke pour memcmp() - Comparaison de deux tableaux d'octets dans .NET

Mais, je veux comparer seulement les parties du byte[] - en offset, et il n'y a pas memcmp() avec décalage car il utilise des pointeurs

.
int CompareBuffers(byte[] buffer1, int offset1, byte[] buffer2, int offset2, int count)
{
  // Somehow call memcmp(&buffer1+offset1, &buffer2+offset2, count)
}

Dois-je utiliser C ++ / CLI pour le faire?

Dois-je utiliser PInvoke avec IntPtr? Comment?

Merci.

Était-ce utile?

La solution

C ++ / CLI sera certainement le plus propre, mais cela ne justifie guère en ajoutant C ++ / CLI à votre projet si vous n'êtes pas déjà l'utilisez.

Que diriez-vous Marshal.UnsafeAddrOfPinnedArrayElement (tableau, offset)?

Autres conseils

[DllImport("msvcrt.dll")]
private static extern unsafe int memcmp(byte* b1, byte* b2, int count);

public static unsafe int CompareBuffers(byte[] buffer1, int offset1, byte[] buffer2, int offset2, int count)
{
    fixed (byte* b1 = buffer1, b2 = buffer2)
    {
        return memcmp(b1 + offset1, b2 + offset2, count);
    }
}

Vous pouvez également ajouter une validation des paramètres.

Pas besoin de P / Invoke en C ++ / CLI. Utilisez pin_ptr <> pour épingler le tableau. Cela vous obtient un octet *, il suffit d'ajouter le décalage.

Peu importe ce que vous faites, vous devez vérifier que les valeurs de décalage / de comptage sont valables pour les tableaux d'octets donnés. Une fois que vous faites cela, je ne vois pas comment faire juste une boucle de for en C # va être plus lentement que P / Invoquer une méthode Win32. On dirait qu'il y aurait beaucoup de frais généraux dans le P / Invoke qu'il ne serait pas utile.

En outre, il y a toujours dangereux C #.

Comme toutes les questions de performance, vous devez faire vos propres tests de performance. Mais il me semble que vous essayez d'optimiser les performances prématurément.

Il y a une façon plus

SequenceEqual de System.Linq

 byte[] ByteArray1 = null;
 byte[] ByteArray2 = null;

 ByteArray1 = MyFunct1();
 ByteArray2 = MyFunct2();

 if (ByteArray1.SequenceEqual<byte>(ByteArray2))
 {
    MessageBox.Show("Same");
 }
 else
 {
   MessageBox.Show("Not Equal");
 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top