Pregunta

Estoy buscando un script (o programación de nivel superior) idioma (o módulos por ejemplo, para Python o lenguajes similares) para el análisis de esfuerzo y de la manipulación de datos binarios en archivos (por ejemplo, volcados de memoria), tal como perl permite manipular archivos de texto sin problemas .

Las cosas que quiero hacer incluir la presentación de fragmentos arbitrarios de los datos en diversas formas (binario, decimal, hexadecimal), convertir datos de un endianess a otro, etc. Es decir, cosas que normalmente usaría C o montaje para, pero estoy buscando un lenguaje que permite escribir pequeñas piezas de código para fines muy específicos, de una sola vez muy rápidamente.

¿Alguna sugerencia?

¿Fue útil?

Solución

  

Las cosas que quiero hacer incluir la presentación de fragmentos arbitrarios de los datos en diversas formas (binario, decimal, hexadecimal), convertir datos de un endianess a otro, etc. Es decir, cosas que normalmente usaría C o montaje para, pero estoy buscando un lenguaje que permite escribir pequeñas piezas de código para fines muy específicos, de una sola vez muy rápidamente.

Bien, si bien puede parecer contrario a la intuición, encontré Erlang muy bien adaptado para ello, es decir, debido a su potente soporte para href="http://en.wikibooks.org/wiki/Erlang_Programming/Pattern_Matching" juego , incluso para bytes y bits (llamados " Erlang Bit sintaxis "). Lo que hace muy fácil la creación de programas, incluso muy avanzadas que se ocupan de la inspección y manipulación de datos en un byte-e incluso en un nivel de bits:

  

Desde 2001, el lenguaje funcional Erlang viene con un tipo de datos orientada a bytes (llamado binario) y con construcciones que hacer patrones sobre un binario.

Y para citar informIT.com :

  

(Erlang) La concordancia de patrones realmente empieza a ser   diversión cuando se combina con el binario   tipo. Considere una aplicación que   recibe paquetes desde una red y   a continuación, los procesa. Los cuatro bytes   un paquete podría ser un orden de bytes de red   Tipo de identificador de paquete. En Erlang, se   sólo se necesita una única processPacket   función que podría convertir esto en   una estructura de datos para uso en interior   tratamiento. Se vería algo   de esta manera:

processPacket(<<1:32/big,RestOfPacket>>) ->
    % Process type one packets
    ...
;
processPacket(<<2:32/big,RestOfPacket>>) ->
    % Process type two packets
    ...

Así, Erlang con su base de apoyo a la coincidencia de patrones y que sea un lenguaje funcional es muy expresiva, véase por ejemplo la implementación de ueencode en Erlang:

uuencode(BitStr) ->
<< (X+32):8 || <<X:6>> <= BitStr >>.
uudecode(Text) ->
<< (X-32):6 || <<X:8>> <= Text >>.

Para una introducción, consulte Bitlevel binarios y generalizada de comprensión en Erlang . también es posible que desee comprobar hacia fuera algunos de los siguientes indicadores:

Otros consejos

El cadena de bits módulo fue escrito para este propósito. Se le permite tomar las rebanadas de datos binarios arbitrarios y ofrece una serie de diferentes interpretaciones a través de propiedades de Python. También le da un montón de herramientas para la construcción y modificación de datos binarios.

Por ejemplo:

>>> from bitstring import BitArray, ConstBitStream
>>> s = BitArray('0x00cf')                           # 16 bits long
>>> print(s.hex, s.bin, s.int)                       # Some different views
00cf 0000000011001111 207
>>> s[2:5] = '0b001100001'                           # slice assignment
>>> s.replace('0b110', '0x345')                      # find and replace
2                                                    # 2 replacements made
>>> s.prepend([1])                                   # Add 1 bit to the start
>>> s.byteswap()                                     # Byte reversal
>>> ordinary_string = s.bytes                        # Back to Python string

También hay funciones para la lectura de bits y la navegación en la cadena de bits, al igual que en los archivos; de hecho, esto se puede hacer directamente desde un archivo sin leer en la memoria:

>>> s = ConstBitStream(filename='somefile.ext')
>>> hex_code, a, b = s.readlist('hex:32, uint:7, uint:13')
>>> s.find('0x0001')         # Seek to next occurence, if found
True

También hay diferentes puntos de vista con endiannesses, así como la capacidad de intercambiar orden de bits y mucho más - echar un vistazo a la manual de .

Tome un vistazo a pitón cadena de bits , parece exactamente lo que quiere:)

Estoy usando 010 Editor para ver los archivos binarios todo el tiempo para ver los archivos binarios. Está especialmente dirigida a trabajar con archivos binarios.

Tiene un fácil utilizar el c-como lenguaje de script para analizar los archivos binarios y presentarlos de una manera muy legible (como un árbol, campos codificados por colores, cosas por el estilo) .. Hay algunos scripts de ejemplo para analizar zipfiles y bmpfiles.

Cada vez que se crea un formato de archivo binario, siempre hago un pequeño script para 010 editor para ver los archivos. Si usted tiene algunos archivos de cabecera con algunas estructuras, por lo que un lector de archivos binarios es una cuestión de minutos.

Cualquier lenguaje de programación de alto nivel con el paquete / funciones de desempaquetado va a hacer. Los 3 Perl, Python y Ruby pueden hacerlo. Es cuestión de preferencia personal. Escribí un poco de análisis sintáctico binario en cada uno de estos y sentí que Ruby era más fácil / más elegante para esta tarea.

¿Por qué no utilizar un intérprete de C? Siempre les solía experimentar con fragmentos, pero se puede usar una secuencia de comandos a algo así como describes sin demasiados problemas.

Siempre me ha gustado EiC . Estaba muerto, pero el proyecto ha sido resucitado últimamente. EiC es sorprendentemente capaz y razonablemente rápido. También hay CINT . Ambos pueden ser compilado para diferentes plataformas, aunque creo que necesita CINT Cygwin en las ventanas.

biblioteca estándar de Python tiene algo de lo que necesite - módulo de la matriz en en particular le permite leer fácilmente partes de los archivos binarios, endianness de intercambio, etc; la estructura módulo permite la interpretación de grano fino de cadenas binarias. Sin embargo, tampoco es tan rico como sea necesario: por ejemplo, para presentar los mismos datos que los bytes o medias palabras, es necesario copiarlo entre dos matrices (la numpy de terceros add-on es mucho más potente para la interpretación de la misma área de la memoria de varias maneras diferentes), y, por ejemplo, para mostrar algunos bytes en hexadecimal no hay mucho " liado" más allá de un simple lazo o lista por comprensión como [hex(b) for b in thebytes[start:stop]]. Sospecho que hay módulos reutilizables de terceros para facilitar dichas tareas aún más, pero no puedo apuntar a uno ...

Forth también puede ser bastante bueno en esto, pero es un poco arcano.

Bueno, si la velocidad no es una consideración, y desea que el Perl, luego traducir cada línea de binario en una línea de caracteres - de 0 y 1 de. Sí, sé que no hay saltos de línea en binario :) pero se supone que tener un poco de tamaño fijo - por ejemplo, por byte o alguna otra unidad, con el que puede romper la burbuja binario.

A continuación, sólo tiene que utilizar el procesamiento de cadenas Perl en que los datos:)

Si usted está haciendo el procesamiento de nivel binario, que es un nivel muy bajo y es probable que ser muy eficientes y tienen dependencias mínimas / instalar requisitos.

Así que me gustaría ir con C - trabaja con bytes bien -. Y probablemente puede buscar en Google para algunos paquetes de librerías que manejan bytes

Ir con algo así como Erlang introduce ineficiencias, dependencias y otro equipaje es probable que no desee con una biblioteca de bajo nivel.

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