Как вызвать MEMCMP () на две части байта [] (с смещением)?
Вопрос
Я хочу сравнить части byte[]
эффективно - так я понимаю memcmp()
должен быть использован.
Я знаю, что могу использовать Pinvoke, чтобы позвонить memcmp()
- Сравнение двух байтовых массивов в .NET
Но я хочу сравнить только части byte[]
- использование смещения, и нет memcmp()
с компенсацией, поскольку он использует указатели.
int CompareBuffers(byte[] buffer1, int offset1, byte[] buffer2, int offset2, int count)
{
// Somehow call memcmp(&buffer1+offset1, &buffer2+offset2, count)
}
Должен ли я использовать C ++ / CLI, чтобы сделать это?
Должен ли я использовать PinVoke с IntPTR? Как?
Спасибо.
Решение
C ++ / CLI определенно будет самым чистым, но это вряд ли оправдывает добавление C ++ / CLI в ваш проект, если вы еще не используете его.
Как насчет Marshal.unsafeaddrofpinnedarrayElement.(Массив, смещение)?
Другие советы
[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);
}
}
Вы также можете добавить некоторую проверку параметра.
Нет надо p / вызывать в C ++ / CLI. Используйте PIN_PTR <> для установки массива. Это дает вам байт *, просто добавьте смещение.
Неважно, что вы делаете, вы должны проверить, что значения смещения / счетчики действительны для данных байтовых массивов. После того, как вы сделаете это, я не вижу, как просто делать for
Цикл в C # будет медленнее, чем P /, вызывающий метод Win32. Похоже, в P / вызывает много накладных расходов, что он не будет стоить.
Кроме того, всегда есть небезопасный C #.
Как и во всех вопросах производительности, вы должны выполнять свое собственное тестирование производительности. Но это звучит для меня, как вы пытаетесь оптимизировать для преждевременно производительности.
Есть еще один способ
SequenceEcrave от 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");
}