Как вызвать MEMCMP () на две части байта [] (с смещением)?

StackOverflow https://stackoverflow.com/questions/3000803

Вопрос

Я хочу сравнить части 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");
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top