Apakah aman menggunakan input & output standar dengan data biner?

14

Saya perlu membagi file biner menjadi dua. Saya bertanya-tanya apakah kepala dan / atau ekor dapat digunakan tetapi kemudian saya bertanya-tanya ... apakah aman untuk menggunakan pengalihan, pemipaan dll dengan data biner? Apakah baris baru menjadi berantakan, atau nulls diabaikan, atau mundur atau menghapus melakukan sesuatu yang istimewa? (bash, kubuntu 18,04 LTS)

B.Tanner
sumber
1
Lihatlah splitperintahnya.
egmont

Jawaban:

19

Ya, aman jika Anda mengirimnya ke proses lain atau menyimpannya ke file. Ada potensi "keanehan" jika Anda membiarkan stdout biner mencetak ke terminal karena dapat berisi urutan keluar (secara acak) yang sementara dapat mengacaukan tampilan terminal.

Eric Mintz
sumber
6
Dalam hal ini Anda dapat mengetik resetdan menekan enter untuk memperbaikinya.
Baard Kopperud
4
@ BaardKopperud Saya pikir saya membaca di suatu tempat tentang beberapa kasus sudut di mana tset / reset tidak bekerja
Xen2050
1
@ Xen2050 saya tidak tahu. satu-satunya kasus yang akan terjadi jika beberapa urutan escape mengubah tata letak keyboard / encoding, sehingga mengetik reset<enter> tidak benar-benar mengetik urutan karakter seperti yang terlihat oleh terminal ...
Bakuriu
3
Lihat juga Perbaiki terminal setelah menampilkan file biner dan Mengapa kadang-kadang konsol kebutuhan reset setelah CTRL + C . Seperti yang disarankan di tautan pertama, stty sane; tput rs1urutan perintah akan melakukan trik ketika ada kasus sudut resettidak berfungsi. Kasus-kasus seperti itu, selain disebutkan oleh Bakuriu, dapat mencakup lebar garis terminal / kolom atau saya menduga pengaturan terkait dengan komunikasi serial (baudrate / parity).
Sergiy Kolodyazhnyy
1

Masalah utama dengan menggunakan perintah like headatau tailadalah bahwa mereka berorientasi garis dan file biner tidak. Jika mereka memiliki baris baru di dalamnya, mereka sering tidak digunakan untuk mewakili akhir baris dan jika mereka, mereka mungkin hanya menjadi bagian dari string seperti pesan program atau bidang data.

Jika data terstruktur dengan cara apa pun, maka Anda harus memperhitungkannya dalam memilih titik perpecahan sehingga Anda tidak mematahkan struktur di tengah.

Jika Anda mengetahui struktur file, Anda dapat menggunakan perintah seperti

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

dengan opsi untuk hanya menyalin begitu banyak blok data dengan ukuran tertentu mulai dari offset tertentu (yang bertambah) ke dalam file.

Sepertinya splitperintah seperti yang disebutkan oleh @egmont akan mengotomatiskan proses ini untuk Anda, tetapi tampaknya berorientasi garis secara default, jadi Anda harus menentukan opsi tambahan seperti --bytes countmemberi tahu seberapa besar masing-masing bagian file harus menjadi.


Sebagai catatan tambahan, jika Anda tidak tahu apa yang ada di file, tetapi curiga file itu mengandung setidaknya beberapa data tekstual yang bermakna, stringsperintahnya adalah cara yang bagus untuk melihat pertama kali untuk melihat apa yang Anda hadapi.

strings -n 6 file | less

akan menemukan semua karakter yang dapat dicetak yang panjangnya setidaknya enam karakter dan menampilkannya dalam pager sehingga mereka tidak terbang di terminal. Menggunakan angka yang sedikit lebih besar dari standar 4 karakter membantu menghilangkan potongan kecil data yang hanya bisa dicetak, tetapi tidak digunakan seperti itu dalam file.

Jika nanti Anda harus menjelajahi file lebih detail dengan editor biner seperti hexedit, Anda akan memiliki beberapa landmark yang menunjukkan di mana sesuatu yang menarik mungkin ditemukan.

stringsmemiliki opsi - t x yang akan mendahului setiap string yang dicetak dengan offset ke dalam file dalam heksadesimal (o untuk oktal / d untuk desimal) sehingga Anda tahu di mana menemukannya nanti. Bahkan file yang sangat pendek banyak yang harus ditangani ketika Anda harus melihatnya dari karakter ke karakter.

Joe
sumber