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.

È stato utile?

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");
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top