¿Alguna utilidad genérica o biblioteca para convertir volcados hexadecimales en forma legible para humanos?

StackOverflow https://stackoverflow.com/questions/191652

Pregunta

Trabajo mucho con comunicaciones en serie con una variedad de dispositivos, por lo que a menudo tengo que analizar volcados hexadecimales en archivos de registro. Actualmente, hago esto manualmente mirando los volcados, mirando las especificaciones del protocolo y escribiendo los resultados. Sin embargo, esto es tedioso y propenso a errores, especialmente cuando los mensajes contienen cientos de bytes y contienen mezclas de datos big-endian y little-endian, ASCII, Unicode, compresión, CRC, etc. . . .

He escrito algunos scripts de Python para ayudar con los casos más comunes. Pero hay muchos protocolos con los que lidiar, y no tiene sentido pasar el tiempo escribiendo un script personalizado a menos que sepa que tendré muchos volcados para analizar.

Lo que me gustaría es algún tipo de utilidad que pueda automatizar esta actividad. Entonces, por ejemplo, si tengo un volcado hexadecimal textual como este:

7e ff 00 7b  00 13 86 04
00 41 42 43  44 56 ef 7e

y algún tipo de descripción del formato del mensaje, como este:

# Field         Size        Byte Order  Output Format
Flag            1                       hex
Address         1                       hex
Control         1                       hex
DataType        1                       decimal
LineIndex       1                       decimal
PollAddress     2           msb         hex
DataSize        2           lsb         decimal
Data            (DataSize)              ascii
CRC             2           lsb         hex
Flag            1                       hex

Obtendría una salida como esta:

Flag            0x7e
Address         0xff
Control         0x00
DataType        123
LineIndex       0
PollAddress     0x1386
DataSize        4
Data            "ABCD"
CRC             0xef56
Flag            0x7e

Los analizadores de protocolos basados ??en hardware a menudo tienen características sofisticadas para hacer este tipo de cosas, pero necesito trabajar con archivos de registro de texto.

¿Existe alguna utilidad o biblioteca de este tipo?


Han surgido algunas buenas respuestas desde que configuré la recompensa. ¡Supongo que las recompensas funcionan!

Wireshark y HexEdit parecen prometedores; Echaré un vistazo a esos, y probablemente otorgaré la recompensa a cualquiera que satisfaga mis necesidades. Pero todavía estoy abierto a otras ideas.

¿Fue útil?

Solución

Wireshark es bastante bueno para abrir protocolos de red.

Otros consejos

Supongo que necesitas un buen editor hexadecimal. Eche un vistazo a hexedit . He usado la versión gratuita en el pasado y es buena, pero no sé si ofrece lo que estás buscando. Básicamente, desea poder definir una estructura y luego poder decodificar datos hexadecimales contra ella. Supongo que un buen editor hexadecimal apoyaría esto. Verifique la versión paga de HexEdit o google para otro editor; hay muchos disponibles.

Normalmente, uso emacs hexl-mode para ver archivos binarios como un "text-dump". Cuando necesito una salida más específica, solo hago lo mismo que tú y escribo un analizador en C ++.

En mi trabajo, estábamos diseñando protocolos de red y en serie para controlar el hardware incorporado. También me cansé de leer mal los volcados y de escribir guiones para cada protocolo, así que escribí una biblioteca para hacer exactamente lo que usted describe. Podría darle una descripción del archivo de texto del protocolo, y tenía una interfaz gráfica de usuario que admitía casillas de verificación para configurar bits individuales, botones de opción para elegir entre las combinaciones válidas de bits y listas desplegables cuando había muchas opciones. Puede editar la vista hexadecimal de los datos, la vista binaria de cada campo, o incluso apuntar y hacer clic en los campos, y todas las demás vistas se actualizarán. Nos ahorró un montón de tiempo. Es un poco rápido y sucio, pero lo publicaría si no fuera propiedad de mi empleador. El punto es que no fue muy difícil de escribir, y una vez que me alejé de los scripts para cada protocolo y de un programa que podía entender una descripción del protocolo, las cosas fueron geniales. Detuvimos los errores relacionados con la lectura errónea de un volcado y agregar nuevos protocolos se volvió trivial. Además, la descripción textual del protocolo fue directamente a las especificaciones de desarrollo para que los chicos del software supieran qué hacer con el hardware. Te animo a que te des cuenta.

Un posible punto de partida sería libPDL , una biblioteca de C ++.

Otra opción puede ser NetPDL .

Debe usar los comandos Tcl binary para cosas Me gusta esto. Lo que sigue es el punto de partida para su ejemplo anterior. Tcl es realmente fácil de aprender y escribir scripts. Si estás haciendo cosas de comunicación en serie, te debes a ti mismo aprender al menos los conceptos básicos.

bash$ tclsh
% binary scan [binary format H* 7eff007b00138604004142434456ef7e] \
  H2H2H2ccH4sa4h4H2 \
  flag1 addr ctl datatype lineidx polladdr datasize data crc flag2
10
% puts "$flag1 $addr $ctl $datatype $lineidx \
  $polladdr $datasize $data $crc $flag2"
7e ff 00 123 0 1386 4 ABCD 65fe 7e

Cuando hiciste tu orden de bytes, cambiaste los bytes pero no los bits, así que no estoy realmente seguro de lo que estabas buscando allí. De todos modos, esto te ayudará a comenzar.

Eche un vistazo a hexworkshop

Lo he estado usando durante años para analizar volcados hexadecimales. Tiene un Visor de estructura que le permite definir la estructura de datos a en estilo C / C ++ y luego muestra los datos en ese formato.

WinHex admite la visualización / edición de formatos de registro definidos por el usuario. Hay algunos ejemplos en http://www.x-ways.net/winhex/templates/index.html

Estoy bastante seguro de que vi algo así en CPAN. Podría ser más vago si quieres. :-)

Actualización: no es exactamente lo que desea, pero eche un vistazo a Parse :: Binary :: FixedFormat

Hay una utilidad de línea de comandos BSD llamada hexdump que hace esto mediante el uso de cadenas de formato (que pueden estar en un archivo externo). Consulte https://www.suse.com/communities/blog/making- sense-hexdump / para una introducción, y por ejemplo https://www.freebsd.org/cgi/man.cgi? query = hexdump & amp; sektion = 1 para la página del manual (con especial atención a las opciones -e y -f y la sección titulada Formats ).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top