كيفية استدعاء 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/Invoke حتى أنه لن يكون جديراً بالاهتمام.
أيضا ، هناك دائما غير آمن ج#.
كما هو الحال مع جميع أسئلة الأداء ، يجب عليك إجراء اختبار الأداء الخاص بك. لكن يبدو لي كما تحاول تحسين الأداء قبل الأوان.
هناك طريقة أخرى
تسلسل من النظام
byte[] ByteArray1 = null;
byte[] ByteArray2 = null;
ByteArray1 = MyFunct1();
ByteArray2 = MyFunct2();
if (ByteArray1.SequenceEqual<byte>(ByteArray2))
{
MessageBox.Show("Same");
}
else
{
MessageBox.Show("Not Equal");
}