.NET ¿Cómo buscar una cadena en un fichero binario?

Hola. Veréis, me estoy comiendo bastante la cabeza con un problema de ingenio, a ver si a alguien se le ocurre la solución. Con un pequeño programa desarrollado en C#, trato de buscar una cadena de caracteres en un fichero binario.

Por ejemplo, que me busque CADENA en:

oiuadh541f5oi5f1nCADENAfddsfds4a5ga5d54s5fs

(y bueno, después me debe devolver algunos caracteres que hay detrás de cadena).

No se como hacerlo, la única forma viable es que busque caracter por caracter hasta que encuentre una C. Una vez que la he encontrado, meto en un buffer los 5 caracteres siguientes, si son: "ADENA" ¡la he encontrado! pero si no he consumido caracteres en vano: a partir de ahora me seguirá leyendo después de la A (si por ejemplo, dentro del fichero hubiera CCADENA, por esta deficiencia, CADENA no sería reconocida).

¿A alguien se le ocurre como hacerlo?.

Saludos.
Uhmm, a ver una preguntilla, las cadenas que quieres buscar en tu archivo siguen algun patrón conocido? que estructura tiene tu archivo?

De C# se muy poco, pero me he presentado con cosas parecidas en algún momento.

PD: Coño, vale no lo he leído. el idcudcucurjbichjbfmerpCADENAihchweg9uhweru [+risas] , la idea es como dices, pero por qué guardas en un buffer el cadena.length y lees los 5 siguientes? no sería lo suyo una vez encontrado el patrón (que yo pienso que se debería definir como cadena[0], el primer carácter) comparar caracter a caracter y sino seguir desde el cadena[0]??

O es que guardas todo el archivo binario en un buffer...

ByEs [buenazo]
Algoritmo perfecto para hacer esto:

Introduces la cadena a buscar -> Cuentas caracteres (pongamos 6)
Guardas en un buffer los primeros 6 caracteres del chorizo en el cual tienes que buscar la cadena. ¿Coincide? -> NO
Guardas en un buffer los caracteres 1-7 del chorizo. ¿Coincide? -> NO
Guardas en un buffer los caracteres 2-8 del chorizo. ¿Coincide? -> SI -> Terminaste

Espero que te sirva de ayuda.
bitman escribió:guardas en un buffer el cadena.length y lees los 5 siguientes? no sería lo suyo una vez encontrado el patrón (que yo pienso que se debería definir como cadena[0], el primer carácter) comparar caracter a caracter y sino seguir desde el cadena[0]??

Tu solución no es buena porque puede que la cadena que busco no esté en posiciones múltiplos de 5, por ejemplo en:

aaCAD ENAaa

aaCAD no coincide con CADENA, ENAaa tampoco (pero CADENA está en medio).

Stylish escribió:Algoritmo perfecto para hacer esto:

Introduces la cadena a buscar -> Cuentas caracteres (pongamos 6)
Guardas en un buffer los primeros 6 caracteres del chorizo en el cual tienes que buscar la cadena. ¿Coincide? -> NO
Guardas en un buffer los caracteres 1-7 del chorizo. ¿Coincide? -> NO
Guardas en un buffer los caracteres 2-8 del chorizo. ¿Coincide? -> SI -> Terminaste

Espero que te sirva de ayuda.

Creo que la solución es esta que has dado :). Con una matización: hay que hacer los últimos pasos tantas veces como longitud tenga la cadena.

Introduces la cadena a buscar -> Cuentas caracteres (pongamos 6)
Guardas en un buffer los primeros 6 caracteres del chorizo en el cual tienes que buscar la cadena. ¿Coincide? -> NO
* Guardas en un buffer los caracteres 1-7 del chorizo. ¿Coincide? -> NO
Guardas en un buffer los caracteres 2-8 del chorizo. ¿Coincide? -> NO
Guardas en un buffer los caracteres 3-9 del chorizo. ¿Coincide? -> NO
Guardas en un buffer los caracteres 4-10 del chorizo. ¿Coincide? -> NO
Guardas en un buffer los caracteres 5-11 del chorizo. ¿Coincide? -> NO

Volver a * tomando los 6 siguientes caracteres.

Gracias por vuestras respuestas :).

Como curiosidad, quiero esto para saber qué texturas contenidas en una carpeta (cuyo nombre conozco) están dentro de un archivo BSP (mapas del Half Life 2). Quizá me empape un poco la especificación y me haga una idea de por donde pueda andar las cadenas de las texturas para simplificar el asunto.

Saludos.
.NET no tiene expresiones regulares? con eso se hace con la minga.
juas escribió:.NET no tiene expresiones regulares? con eso se hace con la minga.


No pensaba que lo diría nunca pero:

+1

Usa expresiones regulaes ja! posti.
5 respuestas