É seguro usar entrada e saída padrão com dados binários?

14

Eu preciso dividir um arquivo binário em dois. Eu queria saber se a cabeça e / ou cauda poderia ser usada, mas então eu me perguntei ... é seguro usar o redirecionamento, a tubulação etc. com dados binários? As novas linhas são bagunçadas, ou os nulos são ignorados, ou retrocedem ou excluem algo especial? (bash, kubuntu 18.04 LTS)

B.Tanner
fonte
1
Dê uma olhada no splitcomando.
Egmont

Respostas:

19

Sim, é seguro se você canalizar para outro processo ou salvá-lo em um arquivo. Existe uma "estranheza" potencial se você deixar o stdout binário imprimir em um terminal, pois ele pode conter seqüências de escape (aleatoriamente) que podem atrapalhar temporariamente a exibição do terminal.

Eric Mintz
fonte
6
Nesse caso, você pode digitar resete pressionar enter para corrigi-lo.
Baard Kopperud
4
@BaardKopperud Eu pensei que eu li em algum lugar sobre alguns casos de canto onde tseta / reset não iria funcionar
Xen2050
1
@ Xen2050 não sei. o único caso que poderia acontecer se alguma sequência de escape muda o layout do teclado / codificação, de modo que digitação reset<enter> na verdade não digitar a sequência de caracteres como visto pelo terminal ...
Bakuriu
3
Veja também Fix terminal após a exibição de um arquivo binário e Por que a necessidade de console, por vezes, o reset após CTRL + C . Conforme sugerido no primeiro link, a stty sane; tput rs1sequência de comandos fará o truque para quando houver casos de canto que resetnão funcionem. Esses casos, além dos mencionados por Bakuriu, podem incluir a largura da linha / colunas do terminal ou estou supondo as configurações relacionadas à comunicação serial (baudrate / paridade).
Sergiy Kolodyazhnyy
1

O principal problema com o uso de comandos como headou tailé que eles são orientados a linhas e os arquivos binários não. Se eles possuem novas linhas, geralmente não estão sendo usados ​​para representar o final de uma linha e, se houver, podem fazer parte de cadeias de caracteres, como mensagens de programas ou campos de dados.

Se os dados estão estruturados de alguma forma, é necessário levar isso em consideração ao escolher pontos de divisão para não quebrar estruturas no meio.

Se você conhece a estrutura do arquivo, pode usar um comando como

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

com opções para copiar apenas tantos blocos de dados de um tamanho específico, começando em um deslocamento específico (incrementado) no arquivo.

Parece que o splitcomando mencionado por @egmont automatizará esse processo para você, mas parece ser orientado por linhas por padrão, portanto, você precisará especificar opções adicionais, como --bytes countdizer qual o tamanho de cada parte do arquivo estar.


Como uma observação lateral, se você não sabe o que há em um arquivo, mas suspeita que contém pelo menos alguns dados textuais significativos, o stringscomando é uma ótima maneira de dar uma primeira olhada para ver com o que você está lidando.

strings -n 6 file | less

encontrará todas as séries de caracteres imprimíveis com pelo menos seis caracteres e exibirá-as em um pager para que não voem no terminal. Usar um número um pouco maior que o padrão de 4 caracteres ajuda a eliminar pequenos trechos de dados que, por acaso, podem ser impressos, mas não estão sendo usados ​​dessa maneira no arquivo.

Se mais tarde você precisar explorar o arquivo em mais detalhes com o editor binário, como hexedit, você terá alguns pontos de referência que apontam onde algo interessante pode ser encontrado.

stringstem uma opção - t x que precederá cada sequência impressa com seu deslocamento no arquivo em hexadecimal (o para octal / d para decimal) para que você saiba onde encontrá-la mais tarde. Mesmo arquivos muito curtos são muito para lidar quando você precisa analisá-los caractere por caractere.

Joe
fonte