2009-06-14 9 views
16

Estoy buscando un lenguaje de scripting (o programación de nivel superior) para analizar y manipular fácilmente datos binarios en archivos (por ejemplo, volcados de memoria), al igual que Perl permite manipular archivos de texto sin problemas.¿Qué idioma es binario, como Perl es para enviar mensajes de texto?

Lo que quiero hacer es presentar fragmentos arbitrarios de los datos en varias formas (binario, decimal, hexadecimal), convertir datos de una endialeza a otra, etc. Es decir, cosas que normalmente usaría C o ensamblaje, pero estoy buscando un lenguaje que permita escribir pequeñas piezas de código para fines muy específicos, de una sola vez, muy rápidamente.

¿Alguna sugerencia?

+2

Interesante. Nunca he visto nada más que asm que te permita tratar con datos binarios de esta manera. Sin embargo, no está claro que sea tan útil, ya que las manchas binarias son más o menos inútiles sin interpretación. ¿Por qué no simplemente seguir con C y operaciones a nivel de bit, o lanzar cadenas binarias a Perl? – guns

+0

Casting binary to strings es lo que uso hoy (en Python o Perl) pero tengo la sensación de que debe haber alguna forma más suave y poderosa de hacer esto. Edité la pregunta para tratar de explicar por qué C no es la respuesta, en este caso. – ehdr

+1

Si esto es específicamente sobre volcados de núcleos y programación en C, es posible que también desee consultar el GNU BFD: http://en.wikipedia.org/wiki/Binary_File_Descriptor_library – none

Respuesta

27

Las cosas que quiero hacer incluyen presentar fragmentos arbitrarios de los datos en varias formas (binario, decimal, hexadecimal), convertir datos de una endianess a otra, etc. Es decir, cosas que normalmente usaría C o ensamblaje para, pero estoy buscando un lenguaje que permita escribir pequeñas piezas de código para fines muy específicos, de una sola vez muy rápidamente.

Bueno, si bien puede parecer contrario a la intuición, encontré erlang muy bien adaptado para ello, es decir, debido a su poderoso apoyo para pattern matching, incluso para los bytes y bits (llamados "Erlang Bit Syntax"). 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 byte (llamado binario) y con construcciones para hacer coincidencia de patrones en un binario.

Y para citar informIT.com:

(Erlang) de coincidencia de patrones realmente empieza a ser divertido cuando se combina con el binario tipo. Considere una aplicación que recibe paquetes de una red y y luego los procesa. Los cuatro bytes en un paquete pueden ser un identificador de tipo de paquete de orden de bytes de red. En Erlang, usted solo necesitaría una única función processPacket que podría convertir esto en una estructura de datos para el procesamiento interno . Se vería algo así:

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 bastante 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, vea Bitlevel Binaries and Generalized Comprehensions in Erlang.También es posible que desee comprobar hacia fuera algunos de los siguientes puntos:

+0

Exactamente lo que iba a sugerir. Erlang puede hacer cosas geniales con datos binarios. – JesperE

+2

Yo iría con Erlang también en este –

+0

¡respuesta increíble! extremadamente completo – ine

5

perl's pack y unpack?

+1

Y expresiones regulares que funcionan felizmente en binario, una función que ayudé a depurar en el día a través de mi (ab) uso de la misma. Y puedes empacar/descomprimir en binario si quieres hacer coincidir eso. Las implementaciones recientes con su compatibilidad Unicode parecían haber enturbiado el agua, pero creo que todo eso se puede apagar. –

2

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

2

¿Por qué no utilizar un intérprete C? Siempre los usé para experimentar con fragmentos, pero podrías usar uno para escribir algo como lo que 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 se pueden compilar para diferentes plataformas, aunque creo que CINT necesita Cygwin en Windows.

+0

Este fue mi pensamiento también. No sé EiC, pero cint acepta un dialecto libre (lo hace de forma implícita (pero aún fuerte) cuando no especifica los tipos para la variable recién introducida), lo que hace que tenga un estilo más RAD al escribir macros. – dmckee

2

La biblioteca estándar de Python tiene algo de lo que necesita: el módulo array, en particular, le permite leer fácilmente partes de archivos binarios, endiancias de intercambio, etc .; el módulo struct permite una interpretación más precisa de cadenas binarias. Sin embargo, ninguno es tan rico como se necesita: por ejemplo, para presentar los mismos datos como bytes o medias palabras, debe copiarlo entre dos matrices (el complemento de numpy de terceros es mucho más potente para interpretar la misma área) de memoria de varias maneras diferentes), y, por ejemplo, para mostrar algunos bytes en hexadecimal no hay mucho "incluido" más allá de un simple bucle o comprensión de lista como [hex(b) for b in thebytes[start:stop]]. Sospecho que hay módulos reutilizables de terceros para facilitar tales tareas aún más, pero no puedo señalarle uno ...

3

Estoy usando 010 Editor para ver archivos binarios todo el tiempo para ver archivos binarios. Está especialmente diseñado para trabajar con archivos binarios.

Tiene un lenguaje de scripts de estilo c fácil de usar para analizar archivos binarios y presentarlos de una manera muy legible (como un árbol, campos codificados por color, cosas así) .. Hay algunos scripts de ejemplo para archivos zip y bmpfiles.

Cada vez que creo un formato de archivo binario, siempre hago una pequeña secuencia de comandos para el editor 010 para ver los archivos. Si tiene algunos archivos de encabezado con algunas estructuras, crear un lector para archivos binarios es cuestión de minutos.

0

Si está haciendo un procesamiento de nivel binario, es de muy bajo nivel y es probable que necesite ser muy eficiente y tener requisitos mínimos de instalación/dependencias.

Así que iría con C - maneja bien los bytes - y probablemente puedas buscar en google algunos paquetes de biblioteca que manejan bytes.

Ir con algo así como Erlang introduce ineficiencias, dependencias y otros equipajes que probablemente no desee con una biblioteca de bajo nivel.

+0

En realidad, la velocidad no es un gran problema para mí, ya que la usaré principalmente para "buscar" algún blob binario (por ejemplo, un volcado de núcleo o datos grabados de un flujo) de forma más o menos interactiva, con un tamaño que generalmente se puede contar en megabytes. ¿No conoce algún paquete de biblioteca para C que valga la pena visitar? – ehdr

1

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

+2

A * bit * arcane? :) –

1

Bueno, si la velocidad no es una consideración, y desea Perl, luego traducir cada línea de binario en una línea de caracteres - 0 de y 1's. Sí, sé que no hay avances de línea en binario :) pero, presumiblemente, tiene un tamaño fijo, por ejemplo, por byte o alguna otra unidad, con la que puede dividir el blob binario.

Entonces sólo tiene que utilizar el procesamiento de cadenas Perl en que los datos :)

4

El módulo de Python bitstring fue escrito para este propósito. Le permite tomar porciones arbitrarias de datos binarios y ofrece una serie de interpretaciones diferentes a través de las propiedades de Python. También ofrece muchas herramientas para construir y modificar 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 son vistas con diferentes endiannesses, así como la capacidad de intercambiar orden de bits y mucho más - echar un vistazo a la manual.

Cuestiones relacionadas