Как вызвать memcmp () для двух частей байта [] (со смещением)? - PullRequest
3 голосов
/ 08 июня 2010

Я хочу сравнить части 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? Как?

Спасибо.

Ответы [ 5 ]

14 голосов
/ 15 сентября 2010
[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);
    }
}

Вы также можете добавить проверку некоторых параметров.

5 голосов
/ 09 июня 2010

C ++ / CLI определенно будет самым чистым, но это вряд ли оправдывает добавление C ++ / CLI в ваш проект, если вы его еще не используете.массив, смещение)?

2 голосов
/ 09 июня 2010

Независимо от того, что вы делаете, вы должны проверить, что значения смещения / счетчика действительны для данных байтовых массивов. После того, как вы это сделаете, я не вижу, как выполнение цикла for в C # будет медленнее, чем P / Invoking метода Win32. Похоже, что в P / Invoke было бы много служебных данных, которые не стоили бы.

Кроме того, всегда есть небезопасный C #.

Как и во всех вопросах производительности, вы должны провести собственное тестирование производительности. Но для меня это звучит так, будто вы пытаетесь оптимизировать работу раньше времени.

2 голосов
/ 09 июня 2010

Нет необходимости P / Invoke в C ++ / CLI.Используйте pin_ptr <>, чтобы закрепить массив.Это дает вам байт *, просто добавьте смещение.

0 голосов
/ 18 июля 2017

Есть еще один способ

SequenceEqual из 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");
 }
...