كيفية استدعاء 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/Invoke حتى أنه لن يكون جديراً بالاهتمام.

أيضا ، هناك دائما غير آمن ج#.

كما هو الحال مع جميع أسئلة الأداء ، يجب عليك إجراء اختبار الأداء الخاص بك. لكن يبدو لي كما تحاول تحسين الأداء قبل الأوان.

هناك طريقة أخرى

تسلسل من النظام

 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