Pergunta

Eu quero comparar partes de byte[] eficientemente - então eu entendo memcmp() deve ser usado.

Eu sei que posso usar Pinvoke para ligar memcmp() - Comparando duas matrizes de bytes no .NET

Mas, eu quero comparar apenas partes do byte[] - usando deslocamento, e não há memcmp() com deslocamento, pois usa ponteiros.

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

Devo usar C ++/CLI para fazer isso?

Devo usar Pinvoke com Intptr? Como?

Obrigada.

Foi útil?

Solução

O C ++/CLI será definitivamente o mais limpo, mas isso dificilmente justifica a adição de C ++/CLI ao seu projeto, se você ainda o não estiver usando.

Que tal Marshal.unsfeaddrofpinnedArrayElement(Array, deslocamento)?

Outras dicas

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

Você também pode querer adicionar alguma validação de parâmetros.

Não há necessidade de p/invocar em C ++/CLI. Use pin_ptr <> para fixar a matriz. Isso lhe dá um byte*, basta adicionar o deslocamento.

Não importa o que você faça, você deve verificar se os valores de deslocamento/contagem são válidos para as matrizes de bytes fornecidas. Depois de fazer isso, não vejo como apenas fazer um for O loop em C# será mais lento do que P/Invocar um método Win32. Parece que haveria muita sobrecarga no P/Invoke que não valeria a pena.

Além disso, sempre há C#inseguro.

Como em todas as perguntas de desempenho, você deve fazer seu próprio teste de desempenho. Mas parece que você está tentando otimizar o desempenho prematuramente.

Há mais uma maneira

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top