Byte Array vergleichen ob Byte Array2 vorhanden ist.

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Enixus.

    Byte Array vergleichen ob Byte Array2 vorhanden ist.

    Servus, ich hätte mal eine frage, gibt es in VB eine Funktion mit der ich einen Byte Array überprüfen kann ob er einen Byte Array erhält?

    Ich arbeite im moment mit loops und es ist relativ langsam...


    Also Bsp: Byte Array 1 hat eine länge von 1000000 und Byte Array 2 eine länge von 14, wie kann ich jetzt checken ob in Byte Array 1 die reihenfolge von Byte Array 2 vorhanden ist?
    @petaod: Das dürfte schiefgehen.

    VB.NET-Quellcode

    1. Dim a1() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
    2. Dim a2() As Integer = {3, 4, 5}
    3. Dim t1 As String = a1.ToString ' -> "System.Int32[]"
    4. Dim t2 As String = a2.ToString ' -> "System.Int32[]"

    @Animix: So könnte es gehen:

    VB.NET-Quellcode

    1. Dim a1() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
    2. Dim a2() As Integer = {3, 4, 5}
    3. Dim s1 As New StringBuilder
    4. For i As Integer = 0 To a1.Length - 1
    5. s1.Append(a1(i).ToString)
    6. Next
    7. Dim s2 As New StringBuilder
    8. For i As Integer = 0 To a2.Length - 1
    9. s2.Append(a2(i).ToString)
    10. Next
    11. Dim ind As Integer = s1.ToString.IndexOf(s2.ToString)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @petaod:
    Großes Problem, damit der TE auch was zu denken bekommt. :D
    Einfach bei der Array-Deklaration Integer durch Byte ersetzen.
    Dem String ist das völlig egal.
    "1" kann z.B. auch ULong sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Private Function CheckTwoArrays(ByVal Array1 As Object(), ByVal Array2 As Object()) As Boolean
    2. If Array1.Length > Array2.Length Then
    3. For i As Integer = 0 To Array1.Length - 1
    4. If Array1.Length - i > Array2.Length Then
    5. If Array2.Length = 1 Then
    6. If Array1(i) = Array2(0) Then
    7. Return True
    8. End If
    9. Else
    10. If Array1(i) = Array2(0) And Array1(i + 1) = Array2(1) Then
    11. Dim a As Boolean = True
    12. For i2 As Integer = 0 To Array2.Length - 1
    13. If Not Array2(i2) = Array1(i + i2) Then
    14. a = False
    15. End If
    16. Next
    17. If a = True Then
    18. Return a
    19. End If
    20. End If
    21. End If
    22. Else
    23. Return False
    24. End If
    25. Next
    26. Else
    27. Return False
    28. End If
    29. End Function

    vllt so?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Warfley“ ()

    Warfley schrieb:

    vllt so?

    Auf den ersten Blick und ohne in tiefere Analysen zu verfallen halte ich den Code für
    - nicht besonders übersichtlich
    - nicht besonders effizient/performant

    Da finde ich den Hinweis von ErfinderDesRades wesentlich hilfreicher.
    Sorry.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich denke so ists kürzer und höchstwahrsceinlich auch performanter...

    VB.NET-Quellcode

    1. For i As Integer = 0 To arr1.Length - 1
    2. For j As Integer = 0 To arr2.Length - 1
    3. If arr1(i+j) = arr2(j) Then
    4. If j + 1 = arr2.Length Then Return True
    5. Else
    6. Exit For
    7. End If
    8. next j
    9. Next i
    10. Return False


    In einen String umzuwandeln ist quatsch, dabei durchläuft man jeden String einmal komplett, bei IndexOf durchläuft man den String auch nocheinmal bis zu der Stelle, an welcher der andere enthalten ist...Immer wenn das erste Zeichen dort gefunden wird, wird der String soweit durchlaufen, bis er entweder bis zum Ende kommt oder ein anderes zeichen findet...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich hab da vor kurzem auch mal ne Funktion zu gebastelt. Funzt prima seit Monaten. Möchte meine Lösung nur mal in den Raum werfen. Mir würde keine Optimierungsmöglichkeit mehr einfallen. Laufzeit ist O(n), also linear und der Speicherverbrauch ist mit zwei Integer-Werten ebenfalls minimal.

    Die Funktion gibt den Index des ersten Vorkommens des "suchByteArray"'s in "einByteArray" zurück.

    VB.NET-Quellcode

    1. Private Function IndexOf(ByVal einByteArray As Byte(), ByVal suchByteArray As Byte()) As Integer
    2. Dim treffer As Integer = 0
    3. For i As Integer = 0 To einByteArray.Length - 1
    4. If einByteArray(i) = suchByteArray(treffer) Then treffer += 1 Else treffer = 0
    5. If treffer = suchByteArray.Length Then Return i - suchByteArray.Length + 1
    6. Next
    7. Return -1
    8. End Function

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Enixus“ ()

    Hmm die Methode ist gar nicht mal schlecht, jedoch ist meine leider doch noch etwas besser, da man etwas weniger rechnen muss(+nichts im Speicher hat^^), um es bei mir auf IndexOf anzuwenden müsste ich nur i Zurückgeben(noch eine Rechnung weniger)...

    Eine Verbesserungsmöglichkeit ist mir noch aufgefallen(bei den If-Abfragen):

    VB.NET-Quellcode

    1. If einByteArray(i) = suchByteArray(treffer) Then
    2. treffer += 1
    3. If treffer = suchByteArray.Length Then Return i - suchByteArray.Length + 1
    4. Else
    5. treffer = 0
    6. End If

    Wenn treffer nicht erhöht wird und das Ergebnis des zweiten Ifs im Durchgang davor bereits False war, dann kann es beim nächsten mal auch nicht anders sein...

    Aber insgesamt dürfte der Geschwindigkeitsunterschied der beiden Funktionen wirklich mini minimal sein^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    lol- echt krass jvbsl. Hast echt noch eine If-Abfrage einsparen können. 8o

    Nach längerem Übelegen und nachdem ich mir deinen Quellcode ein wenig näher angeschaut habe, habe ich in meinem Code auch ein Fehlverhalten aufspüren können...
    Beispiel für Fehlverhalten:
    einByteArray -> {abababx}
    suchByteArray -> {ababx}
    Da würde mein Code nichts finden, deiner aber schon, der ist leicht anders. Die Wahrscheinlichkeit für dieses Fehlverhalten wäre zwar schwindend gering, aber sie existiert. Ich tausch meinen Code mal eben lieber durch deinen Code aus. :)

    So... hab's eben mal ausgetauscht und einen kleinen Fehler in deinem Code gerade gefunden. In deinem Code hätte der in seltenen Fällen eine Index-Out-of-Range-Exception geworfen.
    Beispiel:
    einByteArray -> {abcdefghij}
    suchByteArray -> {ghijkl}
    Hab deinen Code dann noch einmal ein wenig ausgebessert (Müsste so jetzt alles richtig sein, oder?):

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Gibt das erste Vorkommen des suchByteArray im einByteArray zurück. Falls nicht gefunden, dann wird -1 zurückgegeben.
    3. ''' </summary>
    4. ''' <param name="einByteArray">Das zu durchsuchende Byte-Array</param>
    5. ''' <param name="suchByteArray">Das gesuchte Byte-Array</param>
    6. ''' <returns></returns>
    7. ''' <remarks></remarks>
    8. Private Function IndexOf(ByVal einByteArray As Byte(), ByVal suchByteArray As Byte()) As Integer
    9. For i As Integer = 0 To einByteArray.Length - 1 - suchByteArray.Length - 1
    10. For j As Integer = 0 To suchByteArray.Length - 1
    11. If einByteArray(i + j) = suchByteArray(j) Then
    12. If j + 1 = suchByteArray.Length Then Return i
    13. Else
    14. Exit For
    15. End If
    16. Next j
    17. Next i
    18. Return -1
    19. End Function

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Enixus“ ()