Un entorno tipo shell para el procesamiento binario.

15

Esta pregunta me llegó un par de veces antes, ahora en respuesta a la pregunta Bucle a través de fragmentos de datos binarios de stdin en Bash Respuestas dadas en /programming/993434/what-language-is-to-binary -as-perl-is-to-text tampoco fueron satisfactorios.

Estoy buscando un entorno de secuencias de comandos adecuado específicamente para manejar E / S con archivos binarios. Sé que puedo usar uno de los lenguajes de programación completos (c / Python / ...) pero tienen una enorme sobrecarga de inicialización y codificación (asignación y fread / fwrite en c, cadenas de bits en Python ...) sin mencionar son menos adecuados para las secuencias de comandos (llamar a otras aplicaciones desde allí). Perl no es mejor con sus unpackfunciones, operación orientada a cadenas y sintaxis tonta.

Algo así od, pero como lenguaje.

Lo que espero

  1. establecer o cambiar endianness con un solo interruptor / comando.
  2. especificación simple del tipo solicitado (algo así como extender bash read varcon int32 var, float varetc.).
  3. manejo de binarios a través de tuberías, omitiendo el número especificado de bytes.
  4. control de flujo de secuencias de comandos estándar (para / if / ...) al que estamos acostumbrados.

Me gustaría procesar datos sin procesar (fotografía, datos científicos, formatos desconocidos y mal documentados) con la misma facilidad y visión que obtienes al inspeccionar archivos ASCII. Estoy usando cahora, pero no es óptimo para secuencias de comandos ad-hoc, y no puede ser interactivo.

¿Alguien sabe una herramienta como esa? Sin software de interfaz gráfica de usuario clicky, por favor, debe funcionar sobre ssh, desde otros scripts, etc. "No existe" es una respuesta aceptable, pero deprimente.

Orión
fuente
2
No quita el dolor del tiempo de inicio, pero encuentro que los bytes de Python 3.3, junto con plumbum, son muy viables: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()¿lo has visto?
Anthon
Puede tomar el código C que tiene ahora y convertirlo en un conjunto de herramientas de línea de comandos que podría usar en un script bash. Si bien no puede poner binario en una variable de shell, puede esconderlo en tuberías con nombre ('fifo'); sus contenidos se guardan en la memoria hasta que desee leerlos.
Ricitos
1
Hay un serio defecto en tu razonamiento WRT python y perl, por cierto. Si bien las herramientas de línea de comandos individuales se compilan, los scripts de shell no lo son e implican mucho bifurcación (si lo desea, bifurcación es) Su discusión, otra pregunta, etc., implica que estaría bien con el uso de bash aquí si pudiera manejar binarios. Python y los scripts de Perl son tanto pre-compilados. Si compara un script de Python o Perl razonablemente complejo frente a un script de bash paralelo, el Perl o Python será un orden de magnitud más rápido . Si no me cree, puede buscar en la web evidencia de lo contrario.
Ricitos
No estoy buscando una herramienta que se ejecute rápido, estoy buscando algo que pueda codificar rápidamente. Por ejemplo, si tengo un programa extraño que genera un int binario para el tamaño de la matriz de estructuras (int, float, float) que le siguen, me gustaría leer rápidamente el tamaño de la matriz y recorrerlo, posiblemente calculando algunos acumulativo o máximo de algunos componentes, o simplemente imprima un componente como columna ascii para el procesamiento de gnuplot. Anthon: gracias, no sabía sobre esto, será útil. Ricitos de oro: Estoy tratando de evitar eso, pero puedo escribir mi propia herramienta al final :)
orion
2
Parece que necesita un tutorial sobre cómo usar perl's unpack(ᵔᴥᵔ)
Stéphane Chazelas

Respuestas:

2

Tengo exactamente el mismo problema que tú durante años también.

Para usos simples no interactivos, me gusta usar el editor de bloques binarios BBE . BBE es binario como SED es texto, incluida su sintaxis arcaica y simplicidad, sin embargo, tiene muchas características que faltan de lo que a menudo necesito, por lo que tengo que combinarlo con otras herramientas. Entonces, BBE es solo una solución parcial. También tenga en cuenta que BBE no ha tenido actualizaciones o mejoras durante años.

Por supuesto, uno puede usar xxdantes y xxd -rdespués de editar los datos con herramientas basadas en texto, pero eso no funcionará cuando los datos en cuestión sean grandes y se requiera acceso aleatorio, por ejemplo, al procesar dispositivos de bloque.

(Nota: para Windows, existe al menos el costoso y patentado lenguaje de scripts WinHex, pero eso no nos llevará a ningún lado).

Para una edición binaria más complicada, generalmente recurro también a Python, aunque a veces es demasiado lento para archivos grandes, que es su principal inconveniente. Espero que Pyston (Python que emplee LLVM para compilar un código de máquina optimizado) algún día madure lo suficiente como para ser utilizable, o incluso mejor, alguien diseñará e implementará un lenguaje de secuencias de comandos de procesamiento binario compacto, rápido y versátil gratuito, para el cual AFAIK no existe U * IX como sistemas todavía.

ACTUALIZAR

También uso el ensamblador plano de ensamblaje Intel x86 de código abierto , o fasm para abreviar, que evolucionó en mucho más que un ensamblador.

Tiene un potente preprocesador de macro basado en bloques de texto (en sí mismo un lenguaje completo) con una sintaxis en la tradición del lenguaje macro de ensamblador turbo de Borland, pero mucho más avanzado.

Además, tiene un lenguaje de manipulación de datos, que permite que los archivos binarios incluyan archivos arbitrarios, realice todo tipo de manipulación binaria y aritmética (solo entero) en "tiempo de compilación" y escriba el resultado en un archivo de salida. Este lenguaje de manipulación de datos tiene estructuras de control y también se está completando.

Es mucho más fácil de usar que escribir un programa que realice alguna manipulación binaria en C y probablemente incluso en Python. Además, se carga deslumbrantemente rápido, ya que es un ejecutable de tamaño pequeño con casi ninguna dependencia externa (hay 2 versiones: o solo requiere libc o puede ejecutarse como un ejecutable estático directamente en el kernel de Linux ABI).

Tiene algunos bordes ruff, como

  1. no es compatible con la concurrencia

  2. al escribir en un ensamblado x86 de 32 bits (aunque funciona en x86_64), probablemente necesite qemu o un emulador similar si desea ejecutarlo en cualquier otra cosa que no sea x86 o x86_64

  3. su potente lenguaje de preprocesador de macros se está completando, esto significa que es mejor que tenga experiencia con lenguajes como Lisp, Haskell, XSLT, o probablemente M4 sería la mejor opción.

  4. Todos los datos que se escribirán en el archivo de salida se realizan en un búfer "plano" en la memoria, y este búfer puede crecer pero no reducirse hasta que el archivo de salida se haya escrito y finalizado fasm. Esto significa que solo se pueden generar archivos como máximo, ya que le queda memoria principal en una sola ejecución de fasm.

  5. los datos solo se pueden escribir en un único archivo de salida para cada ejecución de fasm

  6. Sí, es homebrew, aunque es realmente genial e inteligente

Franki
fuente
2

No necesariamente tiene que "hacer las paces" con el desempaquetado de Perl ... una de las mejores cosas de perl es cómo puede abusar del analizador y la tabla de símbolos para crear su propio idioma, en un paquete personalizado.

¿Es esto básicamente lo que estás buscando?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

El ejercicio es aprender suficiente perl para escribir el paquete MyBinLib. Pregunte en un foro de Perl y la gente probablemente estará feliz de ayudar.

M Conrad
fuente
1

¿Te has encontrado beav con macros pero no pude encontrar secuencias de comandos,

apt-cache show beav extracto:

Con beav, puede editar un archivo en HEX, ASCII, EBCDIC, OCTAL, DECIMAL y BINARY. Puede mostrar pero no editar datos en modo FLOTANTE. Puede buscar o buscar y reemplazar en cualquiera de estos modos. Los datos se pueden mostrar en formato BYTE, WORD o DOUBLE WORD. Mientras se muestran PALABRAS o PALABRAS DOBLES, los datos se pueden mostrar en el orden de bytes de INTEL o MOTOROLA. Se pueden insertar datos de cualquier longitud en cualquier punto del archivo. La fuente de estos datos puede ser el teclado, otro búfer o un archivo. Todos los datos que se muestran se pueden enviar a una impresora en el formato que se muestra. Se pueden manejar archivos que son más grandes que la memoria.

Luego está xxdqué se convierte a / desde el modo de visualización binario / ascii y podría combinarse con sedo vi, pero no tiene la función de intercambio de bytes.

X Tian
fuente
0

Siempre puedes ir por el oro y desplegarte en C o ASM. Si está trabajando con binario sin formato, simplemente bórrelo directamente del registro. Estás 'ya allí'.

puntilla
fuente