Saya sedang memecahkan tantangan di mana saya menemukan file data tanpa ekstensi file. The file
perintah menunjukkan bahwa itu adalah data file (application/octet-stream)
. The hd
perintah menunjukkan GNP. di baris terakhir. Jadi jika saya membalikkan file ini maka saya akan mendapatkan file berformat .PNG , saya mencari kemana-mana tetapi saya tidak menemukan solusi yang menjelaskan bagaimana cara membalikkan konten file biner.
11
Dalam
zsh
(satu-satunya shell yang secara internal dapat menangani data biner (kecuali Anda ingin mempertimbangkan pendekatan pengkodean base64 ksh93 )):LC_ALL=C
: karakter adalah byte$mapfile[file.gnp]
: isifile.gnp
files::
: pisahkan string menjadi konstituen byte-nyaOa
: membalikkanO
rder padaa
subscript rray array itusumber
zsh
bukan satu-satunya shell yang dapat menangani data biner.Berikut adalah salah satu cara membalikkan file biner menggunakan
ksh93
. Saya telah meninggalkan kode "longgar" untuk membuatnya lebih mudah dimengerti.sumber
read
atas seharusnya tidak membaca apa-apa karena dilakukan di akhir file.strace
danksh93
tampaknya berperilaku sangat aneh, di mana ia mencari di semua tempat di dalam file dan membaca dalam jumlah besar pada saat itu. Mungkin varian dari github.com/att/ast/issues/15strace
skrip untuk melihat apa yang saya maksud.ksh93
membaca file ribuan kali lipat. Misalnya, sebelum membaca byte pertama, ia mencari 64KiB dari akhir file, membaca 64KiB, lalu mencari sebelum byte terakhir dan membaca 1 byte dan melakukan sesuatu yang serupa untuk setiap byte. Perhatikan bahwa apa yang dapat Anda lakukan dengan string yang disandikan base64 terbatas, jadi jika Anda membaca lebih dari satu byte pada suatu waktu, akan lebih sulit untuk mengekstraksi masing-masing byte dari itu.Dengan perl:
Uji kinerja:
Hasil:
perl -0777 -F
paling lambat.xxd
adalah yang paling lambat.Catatan: waktu yang
diff
berjalan harus sama untuk semua solusi, karena outputnya harus sama.sumber
perl
satu. Saya tidak menyadari pada saat itureverse
dapat membalikkan string juga, jadi melakukan pemisahan itu tidak masuk akal dan versi Anda jauh lebih baik.Saya mencoba yang berikut ini:
Idenya adalah untuk memaksa 'tac' menggunakan karakter apa saja sebagai pemisah. Saya mencoba itu pada file biner dan tampaknya berfungsi tetapi konfirmasi apa pun akan dihargai.
Keuntungan utama adalah tidak memuat file ke dalam memori.
sumber
tac
8.28) ketika input berisi karakter baris baru.printf '1\n2' | tac -rs . | od -vAn -tc
output\n 2 1
bukan2 \n 1
. Anda juga perluLC_ALL=C
atau.
bisa mencocokkan karakter multi-byte.LC_ALL=C tac -rs $'.\\|\n'
tampaknya bekerja.