Instr para byte arrays [src]

Iniciado por cobein, 31 Mayo 2009, 04:53 AM

0 Miembros y 1 Visitante están viendo este tema.

cobein

Hace mucho que no posteo nada por aca.

Perdon por ponerlo en ingles pero no tengo ganas de escribir esto de vuelta.

A friend of mine was doing some buffer parsing and he was needing a way to find certain bytes in a byte array (an Instr with bytes) so the first answer was, use two loops, one to increase the index in the buffer and the second to compare but, this was kinda crappy so after using the neurons for a while I came out with this solution. Its notably faster and it uses less iterations than a normal 2 loop seach , about  [match position / match bytes len] match position is the index in the buffer where the first match is located.

This function does not make use of any API, meaning it can be modded to speed it up but, I wanted to keep it simple to try the concept.

http://www.mediafire.com/?sharekey=772aae6ba8d94e0c7432d3c9683f450ae04e75f6e8ebb871
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

XcryptOR

#1
very good, jajaja, i've already have seen on HH.

saludos



LeandroA

hola muy bueno, creo que se puede optimizar un poquito mas comparando el primer bits de la búsqueda con el del bucle general


Public Function FindBytes2( _
       ByRef bvSource() As Byte, _
       ByRef bvMatch() As Byte) As Long

    Dim i       As Long
    Dim j       As Long
    Dim bFlag   As Boolean
    Dim lChr As Long
    Dim LenMach As Long
   
    LenMach = UBound(bvMatch)
   
    FindBytes2 = -1
    lChr = bvMatch(0)
   
    For i = 0 To UBound(bvSource)
        If lChr = bvSource(i) Then
            If LenMach > 0 Then
                For j = 1 To LenMach
                    If i + j < UBound(bvSource) Then
                        If bvMatch(j) = bvSource(i + j) Then
                            bFlag = True
                        Else
                            bFlag = False
                            Exit For
                        End If
                    End If
                Next
               
                If bFlag Then
                    FindBytes2 = i
                    Exit For
                End If
            Else
                FindBytes2 = i
                Exit Function
            End If
        End If
    Next
End Function


Saludos, y no te olvides de seguir compartiendos tus proyectos con los de habla hispana porque yo en HH esoy muerto jejej

cobein

=D leandro fijate que hay 2 funciones, la que esta en el form es basica, es la de referencia, despues esta la otra que es mucho mas rapida (compilada) esta en un modulo, pero igual es verdad se puede optimizar la de referencia para ver las diferencia en velocidad.

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.