È sicuro utilizzare input e output standard con dati binari?


14

Devo dividere un file binario in due. Mi chiedevo se testa e / o coda potessero essere usate ma poi mi chiedevo ... è sicuro usare il reindirizzamento, il piping ecc. Con i dati binari? Le nuove righe vengono incasinate, i null ignorati, il backspace o la cancellazione fanno qualcosa di speciale? (bash, kubuntu 18.04 LTS)


1
Dai un'occhiata al splitcomando.
egmont,

Risposte:


19

Sì, è sicuro se lo installi in un altro processo o lo salvi in ​​un file. Esiste una potenziale "stranezza" se si lascia che stdout binario venga stampato su un terminale poiché può contenere sequenze di escape (a caso) che possono rovinare temporaneamente il display del terminale.


6
In tal caso è possibile digitare resete premere Invio per risolverlo.
Baard Kopperud,

4
@BaardKopperud Ho pensato di leggere da qualche parte alcuni casi angolari in cui tset / reset non funzionava
Xen2050

1
@ Xen2050 Non lo so. l'unico caso che potrebbe accadere se una sequenza di escape modifica il layout / codifica della tastiera, in modo che la digitazione reset<enter> non digiti effettivamente quella sequenza di caratteri vista dal terminale ...
Bakuriu,

3
Vedere anche Fix terminale dopo la visualizzazione di un file binario e perché lo fa a volte la necessità console un reset dopo CTRL + C . Come suggerito nel primo collegamento, la stty sane; tput rs1sequenza di comandi farà la differenza quando ci sono casi angolari di resetnon funzionamento. Tali casi, oltre a quelli citati da Bakuriu, potrebbero includere la larghezza della linea / colonne del terminale o sto indovinando le impostazioni relative alla comunicazione seriale (baudrate / parità).
Sergiy Kolodyazhnyy,

1

Il problema principale nell'uso di comandi come heado tailè che sono orientati alla linea e i file binari no. Se contengono righe, spesso non vengono utilizzate per rappresentare la fine di una riga e, se lo sono, potrebbero far parte di stringhe come messaggi di programma o campi di dati.

Se i dati sono strutturati in qualche modo, devi tenerne conto nella scelta dei punti di divisione in modo da non rompere le strutture nel mezzo.

Se conosci la struttura del file, puoi usare un comando come

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

con opzioni per copiare solo tanti blocchi di dati di una dimensione specifica a partire da un determinato offset (incrementato) nel file.

Sembra che il splitcomando come menzionato da @egmont automatizzerà questo processo per te, ma sembra essere orientato alla linea per impostazione predefinita, quindi dovrai specificare ulteriori opzioni in modo da --bytes countdirgli quanto deve essere grande ogni parte del file essere.


Come nota a margine, se non sai cosa c'è in un file, ma sospetti che contenga almeno alcuni dati testuali significativi, il stringscomando è un ottimo modo per dare una prima occhiata per vedere con cosa hai a che fare.

strings -n 6 file | less

troverà tutte le serie di caratteri stampabili lunghi almeno sei caratteri e li visualizzerà in un cercapersone in modo che non volino sul terminale. L'uso di un numero un po 'più grande del valore predefinito di 4 caratteri aiuta a eliminare piccoli frammenti di dati che sono semplicemente stampabili, ma non vengono utilizzati in questo modo nel file.

Se in seguito dovessi esplorare il file in modo più dettagliato con un editor binario come hexedit, avrai alcuni punti di riferimento che indicano dove potrebbe essere trovato qualcosa di interessante.

stringsha un'opzione - t x che precederà ogni stringa stampata con il suo offset nel file in esadecimale (o per ottale / d per decimale) in modo da sapere dove trovarlo in seguito. Anche i file molto brevi hanno molto a che fare quando devi guardarli carattere per carattere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.