2011-09-25 18 views
5

Duplicar posibles:
byte[] array pattern searchdeterminar si el array de bytes contiene bytes en un orden específico

Digamos que tengo una matriz de bytes:

byte[] myArray = new byte[]{1,2,3,4,5,6,7,1,9,3,4,3,4,7,6,5,6,7,8}; 

cómo puede Determino si myArray contiene bytes 9,3,4,3 en ese orden? ¿Tengo que iterar a través de la matriz que agrega cada elemento a una cadena y luego usar el método String.Contains() para saber si esa matriz de bytes contiene esos elementos en ese orden?

Yo sé que puedo hacer semething como:

String s = ""; 
foreach(byte b in myArray) 
{ 
    s = s + b.ToString(); 
} 

//then do 

s.Contains("9343") 

esto no es eficiente en matrices largas. ¿Cuál será una forma más eficiente de hacer esto?

+0

si su están pensando en hacer una cadena para hacer una Contiene: cadena miCadena = System.Text.Encoding.ASCII.GetString (myByteArray) sino esperar una respuesta adecuada ;-) – gordatron

+0

No necesito para convertir a una cuerda. Acabo de usar una cadena porque ese es el único método que conozco que me permitirá hacer ese tipo de comparación. eso fue útil, aunque muchas gracias –

+0

cierto hay una pregunta similar lo siento, no lo encontré. –

Respuesta

8

intente lo siguiente

public static bool ContainsSequence(byte[] toSearch, byte[] toFind) { 
    for (var i = 0; i + toFind.Length < toSearch.Length; i++) { 
    var allSame = true; 
    for (var j = 0; j < toFind.Length; j++) { 
     if (toSearch[i + j] != toFind[j]) { 
     allSame = false; 
     break; 
     } 
    } 

    if (allSame) { 
     return true; 
    } 
    } 

    return false; 
} 
+0

En mi prueba rápida, esto tuvo un error de apagado por uno. Si los datos para encontrar eran los últimos elementos en la matriz, salía del ciclo temprano. Haré un poco más de prueba para verificar esto y publicar la respuesta, pero por ahora es básicamente cantar la primera condición de bucle a '<=' – CubanX

1

El algoritmo más simple que funciona y es a extraer a través de la matriz de bytes hasta que encuentre una coincidencia en el primer byte en el patrón de bytes que estás buscando, entonces caminar a lo largo a través los dos hasta que llegues al final, o si encuentras un desajuste, continúa desde donde lo dejaste. Esto puede "degradarse" si sigues obteniendo coincidencias parciales. Dependiendo de sus necesidades, esto podría ser lo suficientemente bueno (es simple de escribir, simple de mantener).

Si eso no es lo suficientemente rápido para sus propósitos, puede adoptar fácilmente Boyer-Moore.

Cuestiones relacionadas