Comment memcmp appeler () sur deux parties de l'octet [] (avec compensation)?
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.
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");
}