Come chiamare memcmp () su due parti di byte [] (con offset)?
Domanda
voglio mettere a confronto in modo efficiente le parti del byte[]
- così ho capito memcmp()
deve essere utilizzato
so di poter utilizzare PInvoke per chiamare memcmp()
- confronto tra due matrici di byte in .NET
Ma, voglio mettere a confronto solo alcune parti del byte[]
-. Utilizzando offset, e non c'è memcmp()
con compensato in quanto utilizza i puntatori
int CompareBuffers(byte[] buffer1, int offset1, byte[] buffer2, int offset2, int count)
{
// Somehow call memcmp(&buffer1+offset1, &buffer2+offset2, count)
}
Dovrei usare C ++ / CLI per farlo?
Devo usare PInvoke con IntPtr? Come?
Grazie.
Soluzione
C ++ / CLI sarà sicuramente il più pulito, ma questo difficilmente giustifica l'aggiunta di C ++ / CLI al progetto, se non siete già utilizza.
Come su Marshal.UnsafeAddrOfPinnedArrayElement (array, offset)?
Altri suggerimenti
[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);
}
}
Si potrebbe anche voler aggiungere un po 'la convalida dei parametri.
Non c'è bisogno di P / Invoke in C ++ / CLI. Utilizzare pin_ptr <> al pin matrice. Che si ottiene un byte *, basta aggiungere l'offset.
Non importa quello che fai, si dovrebbe controllare che lo scarto / contano i valori sono validi per le date array di byte. Dopo averlo fatto, non vedo come solo facendo un ciclo for
in C # sta per essere più lento di qualsiasi P / Invocare un metodo Win32. Sembra che ci sarebbe un sacco di overhead nella P / Invoke che non sarebbe utile.
Inoltre, c'è sempre pericoloso C #.
Come per tutte le domande di prestazioni, si dovrebbe fare il proprio test delle prestazioni. Ma sembra a me come si sta cercando di ottimizzare le prestazioni prematuramente.
C'è un altro modo
SequenceEqual da 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");
}