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.

War es hilfreich?

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");
 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top