Wie memcmp () auf zwei Teile Byte nennen [] (mit Offset)?
Frage
Ich möchte Teile byte[]
effizient vergleichen - so verstehe ich memcmp()
verwendet werden soll
Ich weiß, ich kann PInvoke mit memcmp()
nennen - Vergleich von zwei Byte-Arrays in .NET
Aber, ich will Teile des byte[]
nur zum Vergleich -. Offset verwendet wird, und es gibt keine memcmp()
mit Offset, da es verwendet Zeiger
int CompareBuffers(byte[] buffer1, int offset1, byte[] buffer2, int offset2, int count)
{
// Somehow call memcmp(&buffer1+offset1, &buffer2+offset2, count)
}
Sollte ich C ++ / CLI, das zu tun?
Sollte ich PInvoke mit IntPtr? Wie?
Danke.
Lösung
C ++ / CLI wird auf jeden Fall das sauberste, aber dies kaum rechtfertigt das Hinzufügen C ++ / CLI zu einem Projekt, wenn Sie nicht bereits verwenden.
Wie wäre es Marshal.UnsafeAddrOfPinnedArrayElement (array, Offset)?
Andere Tipps
[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);
}
}
Sie möchten vielleicht auch einige Parameter Validierung hinzuzufügen.
Keine Notwendigkeit, P / Invoke in C ++ / CLI. Verwenden Sie pin_ptr <>, um das Array zu fixieren. Dass Sie ein Byte * bekommt, fügen Sie einfach den Offset.
Egal, was Sie tun, sollten Sie prüfen, ob der Offset / Zählwerte für den angegebenen Byte-Arrays gültig sind. Nachdem Sie das tun, sehe ich nicht, wie nur eine for
Schleife in C # tun jede langsamer als P / Aufrufen einer Win32-Methode sein wird. Scheint, wie es eine Menge Aufwand in der P wäre / Invoke, dass es sich nicht lohnen würde.
Außerdem gibt es immer unsicher C #.
Wie bei allen Leistungs Fragen, sollten Sie Ihre eigene Leistung testen. Aber es klingt für mich wie Sie vorzeitig für die Leistung zu optimieren versuchen.
Es gibt eine weitere Möglichkeit,
SequenceEqual von 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");
}