Como ligar para o memcmp () em duas partes do byte [] (com deslocamento)?
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.
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");
}