Filestream . Byte a Byte

Iniciado por blaron, 4 Abril 2014, 21:47 PM

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

blaron

Saludos compañeros

tenia una duda a ver si alguien sabria como resolverla.

Resulta que tengo que buscar un codigo en Hex por ejemplo :

80 17 79 64

el problema es que solo se buscar un numero en concreto, estoy utilizando el codigo de la siguiente manera.

       Dim file As New FileStream(TextBox1.Text, FileMode.Open, FileAccess.ReadWrite)
       Dim a As Integer = file.ReadByte()
       While a <> -1

           If a = (&H80) Then

               TextBox2.Text = (TextBox2.Text & a)

           End If

           a = file.ReadByte()
        End While

   End Sub


el problema es que no se como buscar mas, en vez de 80, buscar el codigo completo 80 17 79 64, no se si me explicado bien..

El Benjo

Utiliza un arreglo de bytes con el valor que estás buscando.

Comparas el primer byte del arreglo y si el if devuelve 'TRUE' entonces procedes a comparar si el byte siguiente coincide con el byte siguiente de tu cadena. En caso de que no sea así, entonces regresas a comparar con el primer byte '80'.

Te pondría el código, pero no creo que sean más de 20 líneas de código. Digo, la tienes sencilla.

Saludos.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

blaron

perdona si no entendi  muy bien, es la primera vez que ando toqueteando con bytes.

Supongo que te refieres a crear una array.

Dim array() As Byte = {80, 17, 79, 64}

lo que no se realizar, seria como comparo yo esa array, puesto que la variable "a" es la que tiene el valor del archivo.

¿ Tendria que usar "a" que encuentre un numero principal y luego darle otra opcion de un "if... " ?

Eleкtro

#3
Puedes hacer lo que dijo El Benjo, con un For, aquí tienes infinidad de ejemplos en C#: byte[] array pattern search Puedes convertir el código en http://converter.telerik.com/

Lo que yo hice fue tomar y estudiar varios ejemplos de arriba para escribir en VB.NET un método de uso generico usando LINQ, aunque no soy un experto en bytes, espero que no se me haya pasado nada por alto:

Código (vbnet) [Seleccionar]
   ' Find Byte Pattern
   ' ( By Elektro )
   '
   ' Usage Examples:
   ' Dim Indexes As Integer() = MatchBytePattern({1, 2, 3, 1, 2, 3, 2, 3}, {1, 2}) ' Result: {0, 3}
   '
   ''' <summary>
   ''' Finds a Byte pattern inside a Byte Array and returns the starting indexes of all concurrences.
   ''' </summary>
   ''' <param name="ByteArray">Indicates the Byte Array to search inside.</param>
   ''' <param name="Pattern">Indicates the Byte pattern to match.</param>
   ''' <returns>The starting indexes of all concurrences.</returns>
   Friend Function FindBytePattern(ByVal ByteArray As Byte(), ByVal Pattern As Byte()) As Integer()

        Return Enumerable.Range(0, ByteArray.Length - Pattern.Length + 1).
                          Where(Function(i As Integer) Pattern.Select(Function(b1, b2) New With {b2, b1}).
                          All(Function(p) ByteArray(i + p.b2) = p.b1)).
                          ToArray()

   End Function


Un ejemplo de uso:
Código (vbnet) [Seleccionar]
   Private Sub Test() Handles MyBase.Shown

       Dim Bytes As Byte() =
           {
               1, 2, 3, 4, 5, 6, 7, 8, 9, 33, 55, 22, 77, 4, 45, 62,
               99, 98, 97, 96, 95, 94, 93, 22, 77, 4, 45, 98, 97, 96, 95,
               3, 4, 5, 7, 8, 9, 1, 2, 3, 99, 98, 97, 96, 45, 98, 97, 96
           }

       Dim Find As Byte() = New Byte() {1, 2, 3}

       Dim Indexes As Integer() = FindBytePattern(Bytes, Find) ' Result: {0, 37}

       For Each Index As Integer In Indexes
           MessageBox.Show(CStr(Index))
       Next Index

       Application.Exit()

   End Sub


Conociendo la cantidad de bytes que quieres buscar y obteniendo los índices de cada coincidencia creo que el resto ya es cosa tuya, muy simple...

Saludos