Título: Buscar partes del archivo hex escrito en C# Publicado por: Meta en 2 Septiembre 2023, 17:01 pm Hola:
Estaba pensando en hacer un programa con Windows Form, que lea archivos hex. Se puede abrir con este programa mismo llamado HxD (https://mh-nexus.de/en/downloads.php?product=HxD20). Por ejemplo, puedes ver en un archivo de una imagen esto pero solo pongo un trozo que es largo. (https://i.postimg.cc/8zgW7vL3/Hex1.jpg) Quiero hacer un programa en C#, al menos tener una idea de que al abrir y leer el archivo hex, busque en una dirección en concreta. Por ejemplo, la indicada abajo. En la dirección 7006, en el cual en hex tiene el valor 56 y en ASCII al lado es una letra mayúscula V. (https://i.postimg.cc/Fz9Ft9ST/Hex2.jpg) Si pulsas un botón en el formulario, en un textBox muestra dicho valor 56 y el otro textBox la letra V. Hasta ahí bien. Hay que hacer una especie de diccionario llenos de if, en el que si detecta el 56, en un tercer textBox muestre un mensaje, Español. Si detecta el 57, que muestre Italia, si es el 58 que muestre Portugal. Si en esos if hay otro valor que no esté incluido, que muestre en el tercer textBox, DESCONOCIDO. Hablando parece fácil. ¿Es muy complicado de hacer? Tampoco quiero pegarme media vida averiguar como se hace. Recuerdo que estamos hablando de un solo Byte, no de varios. Que si se puede, también me vale. Saludos. Título: Re: Buscar partes del archivo hex escrito en C# Publicado por: Elektro Enjuto en 3 Septiembre 2023, 03:07 am ¿Es muy complicado de hacer? Tampoco quiero pegarme media vida averiguar como se hace. Windows Forms:
Windows Presentation Framework:
Como podrás comprobar, el control de usuario del editor hexadecimal de WPF es mucho más completo y sofisticado que el control de usuario disponible para WinForms. Quizás lo quieras considerar como opción. El control de usuario "Be.HexEditor" para WinForms también parece tener una funcionalidad implementada para buscar un patrón de texto o bytes:
PD: yo nunca la he llegado a usar, pero no debe ser difícil. Supongo que con toda esta información será suficiente para resolver tus dudas, pero de todas formas aquí te dejo un algoritmo que he desarrollado en VB.NET para buscar un patrón de bytes en un objeto de tipo Stream (y derivados como FileStream, MemoryStream, etc): Código
Puedes convertirlo a C#. Mi algoritmo está basado en este otro escrito en C#: https://stackoverflow.com/a/76443727/1248295 - simplemente le he aportado más versatilidad de uso para poder limitar la búsqueda a una posición inicial y final, y le añadí control de errores. Nota: tanto ese algoritmo y el mio como el algoritmo de la respuesta de 'bruno conde' (https://stackoverflow.com/questions/1471975/best-way-to-find-position-in-the-stream-where-given-byte-sequence-starts/1472689#1472689 (https://stackoverflow.com/questions/1471975/best-way-to-find-position-in-the-stream-where-given-byte-sequence-starts/1472689#1472689)) no son ni por asomo tan rápidos para buscar un patrón de bytes en archivos de gran tamaño (ej. archivos de películas de varios GB) como lo es el algoritmo de búsqueda que utiliza el programa HxD. EDITO: El código anterior pero bastante mejor optimizado, con tiempos de búsqueda mucho más cortos sobre todo para buscar un patrón de bytes en un archivo de varios GB: Código
Por cierto, en .NET Core directamente podrías utilizar la función MemoryExtensions.IndexOf:
Saludos. Título: Re: Buscar partes del archivo hex escrito en C# Publicado por: Meta en 6 Septiembre 2023, 07:13 am Ni más información, voy a analizarlo.
Muchas gracias honorable amigo. ;-) ;-) ;-) Título: Re: Buscar partes del archivo hex escrito en C# Publicado por: Elektro Enjuto en 6 Septiembre 2023, 23:34 pm No me aparece el botón para modificar mi post, creo que en el foro ahora hay un límite de tiempo o algo. En fin, era para corregir un pequeño despiste en el último código, por que la clase BufferedStream implementa la interface IDisposable, así que conviene llamar al método BufferedStream.Dispose para liberar los recursos.
También cabría mencionar que cuando se trata de procesar secuencialmente un FileStream para buscar un patrón de bytes, envolverlo en un objeto BufferedStream como hago en ese código aporta una mejoría de velocidad tremenda, pero por otro lado, cuando se trata de un MemoryStream es totalmente innecesario envolverlo en un objeto BufferedStream y hacerlo influye negativamente ralentizando la búsqueda del patrón de bytes, aunque la diferencia es muy diminuta (aproximadamente 2-3 segundos en mis pruebas) al buscar patrones de bytes que están posicionados casi al final en archivos de unos 2 GB, así que la diferencia es prácticamente imperceptible con búfers de mucho menos tamaño, pero bueno, ahí queda el dato por si se quieren llevar a cabo microoptimizaciones. Saludos Título: Re: Buscar partes del archivo hex escrito en C# Publicado por: Serapis en 28 Septiembre 2023, 13:48 pm Si solo buscas un byte, la búsqueda puede ser secuencial (dentro de un for) y si buscas varios valores de bytes seguidos, tampoco es más complicado.
Código: Idioma Si conoces un índice específico en el array donde se localiza, entonces el bucle for es innecesario. Si por el contrario debe buscarse en múltiples partes, otra función debe llamar a 'ésta', y entre sí deben retener el índice donde se localiza (por referencia), el bucle ya no vale un 'for each', ya deberá ser uno desde el índice hasta el final. Y siempre que se devuelva otro valor distinto de 'desconocido' implica que no se terminó de buscar en el array, luego la siguiente llamada continuará un índice más alto que donde se encontró. Cuando se devuelva 'desconocido', podrá leerse el siguiente tramo (caso de un fichero muy grande y no querer saturar la memoria con una lectura completa del fichero). Si el número de bytes a localizar es mayor de 1 y este valor pueda ser variable, entonces la eficiencia la encontrarás usando el algoritmo de Knuth, Morris y Pratt (KMP), o el de Boyer y Moore (BM)... (el de Karp Rabin puede ser más farragoso para cosas simples). Típicamente se utilizan para cadenas de texto, pero una cadena de texto no dejan de ser bytes consecutivos en el fichero. Eso sí, operando con números si ocupan más de 2 bytes ten en cuenta su 'endianidad'... pues altera el orden de ellos (caso que no ocupa cuando se trata de un texto). Hace años edité el artículo, era un galimatías probablemente producto de una traducción (de entonces) defectuosa del inglés, sin explicaciones ni detalles específicos: https://es.wikipedia.org/wiki/Algoritmo_Knuth-Morris-Pratt Título: Re: Buscar partes del archivo hex escrito en C# Publicado por: Meta en 26 Octubre 2023, 17:56 pm Muchas gracias camaradas, me toca practicar ya que estoy de vacaciones.
|