¿Es seguro usar entradas y salidas estándar con datos binarios?

14

Necesito dividir un archivo binario en dos. Me preguntaba si se podría usar la cabeza y / o la cola, pero luego me pregunté ... ¿es seguro usar redirección, tuberías, etc. con datos binarios? ¿Se alteran las nuevas líneas o se ignoran los nulos, o la retroceso o la eliminación hacen algo especial? (bash, kubuntu 18.04 LTS)

B. Tanner
fuente
1
Echa un vistazo al splitcomando.
egmont

Respuestas:

19

Sí, es seguro si lo canaliza a otro proceso o lo guarda en un archivo. Existe una "rareza" potencial si deja que la impresión estándar binaria se imprima en un terminal, ya que puede contener secuencias de escape (al azar) que pueden estropear temporalmente la pantalla del terminal.

Eric Mintz
fuente
66
En cuyo caso puede escribir resety presionar enter para arreglarlo
Baard Kopperud
44
@BaardKopperud Pensé que había leído en alguna parte sobre algunos casos de esquina donde tset / reset no funcionaría
Xen2050
1
@ Xen2050 No lo sé. el único caso que sucedería si alguna secuencia de escape cambia la disposición / codificación del teclado, de modo que la escritura reset<enter> no escriba esa secuencia de caracteres como se ve en el terminal ...
Bakuriu
3
Consulte también Arreglar terminal después de mostrar un archivo binario y ¿Por qué la consola a veces necesita un reinicio después de CTRL + C ? Como se sugiere en el primer enlace, la stty sane; tput rs1secuencia de comandos hará el truco para cuando hay casos de esquina de resetno funcionar. Tales casos, además de los mencionados por Bakuriu, podrían incluir el ancho de la línea / columnas del terminal o supongo que las configuraciones relacionadas con la comunicación en serie (velocidad de transmisión / paridad).
Sergiy Kolodyazhnyy
1

El principal problema con el uso de comandos como heado tailes que están orientados a líneas y los archivos binarios no. Si tienen nuevas líneas, a menudo no se utilizan para representar el final de una línea y, si lo son, pueden ser parte de cadenas como mensajes de programa o campos de datos.

Si los datos están estructurados de alguna manera, entonces debe tener eso en cuenta al elegir los puntos divididos para no romper las estructuras en el medio.

Si conoce la estructura del archivo, puede usar un comando como

dd -if input-file -of output-file ...

con opciones para copiar solo tantos bloques de datos de un tamaño específico que comienzan en un desplazamiento particular (incrementado) en el archivo.

Parece que el splitcomando mencionado por @egmont automatizará este proceso por usted, pero parece estar orientado a la línea de forma predeterminada, por lo que tendrá que especificar opciones adicionales como--bytes count decirle qué tan grande debe ser cada parte del archivo ser.


Como nota al margen, si no sabe qué hay en un archivo, pero sospecha que contiene al menos algunos datos textuales significativos, el stringscomando es una excelente manera de echar un primer vistazo para ver con qué está tratando.

strings -n 6 file | less

encontrará todas las series de caracteres imprimibles de al menos seis caracteres de longitud y los mostrará en un buscapersonas para que no vuelen en el terminal. El uso de un número un poco mayor que el valor predeterminado de 4 caracteres ayuda a eliminar pequeños fragmentos de datos que simplemente se pueden imprimir, pero que no se usan de esa manera en el archivo.

Si luego tiene que explorar el archivo con más detalle con un editor binario como hexedit , tendrá algunos puntos de referencia que indican dónde se puede encontrar algo interesante.

stringstiene una opción: t x precederá a cada cadena impresa con su desplazamiento en el archivo en hexadecimal (o para octal / d para decimal) para que sepa dónde encontrarla más adelante. Incluso los archivos muy cortos son mucho para tratar cuando tienes que mirarlos carácter por carácter.

Joe
fuente