Pregunta

quiero comparar partes de byte[] eficientemente - por lo que entiendo memcmp() debe utilizarse

.

Yo sé que puedo usar para llamar PInvoke memcmp() - La comparación de dos matrices de bytes en .NET

Pero, quiero comparar únicas partes de la byte[] -. El uso de desplazamiento, y no hay memcmp() con compensado ya que utiliza punteros

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

¿Debo usar C ++ / CLI para hacer eso?

¿Debo usar PInvoke con IntPtr? ¿Cómo?

Gracias.

¿Fue útil?

Solución

C ++ / CLI será sin duda el más limpio, pero esto no justifica la adición de C ++ / CLI para su proyecto si no está ya en uso.

¿Qué hay de Marshal.UnsafeAddrOfPinnedArrayElement (array, offset)?

Otros consejos

[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);
    }
}

También puede ser que desee añadir un poco de validación de parámetros.

No hay necesidad de P / Invoke en C ++ / CLI. Utilice pin_ptr <> para fijar la matriz. Que le consigue un byte *, sólo tiene que añadir el desplazamiento.

No importa lo que hagas, usted debe comprobar que el desplazamiento / cuentan valores son válidos para las matrices de bytes dados. Después de hacer eso, no veo cómo acaba haciendo un bucle en C # for va a ser más lento que P / Al invocar un método de Win32. Parece que habría un montón de gastos generales en el P / Invoke que no sería la pena.

Además, no siempre es insegura C #.

Al igual que con todas las cuestiones de rendimiento, usted debe hacer su propia prueba de rendimiento. Pero me suena como si estuviera tratando de optimizar el rendimiento antes de tiempo.

Hay una forma más

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");
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top