Lingkungan seperti shell untuk pemrosesan biner


15

Pertanyaan ini datang kepada saya beberapa kali sebelumnya, sekarang sebagai jawaban atas pertanyaan Loop melalui potongan data biner dari stdin di Bash Answers yang diberikan di /programming/993434/what-language-is-to-binary -as-perl-is-to-text juga tidak memuaskan.

Saya mencari lingkungan skrip yang cocok khusus untuk menangani I / O dengan file biner. Saya tahu saya dapat menggunakan salah satu bahasa pemrograman yang lengkap (c / Python / ...) tetapi mereka memiliki inisialisasi dan pengkodean overhead yang sangat besar (alokasi dan ketakutan / fwrite dalam c, bitstring dalam Python ...) belum lagi mereka kurang cocok untuk skrip (memanggil aplikasi lain dari itu). Perl tidak lebih baik dengan unpackfungsinya, operasi berorientasi string dan sintaks yang konyol.

Sesuatu seperti od, tetapi sebagai bahasa.

Apa yang saya harapkan:

  1. atur atau ubah endianness dengan satu sakelar / perintah.
  2. spesifikasi sederhana dari tipe yang diminta (sesuatu seperti memperpanjang bash read varwith int32 var, float vardll.)
  3. penanganan biner melalui pipa, melewatkan jumlah byte yang ditentukan.
  4. kontrol aliran skrip standar (untuk / jika / ...) yang biasa kita gunakan.

Saya ingin memproses data mentah (fotografi, data ilmiah, format yang tidak diketahui dan kurang didokumentasikan) dengan kemudahan dan wawasan yang sama dengan yang Anda dapatkan ketika memeriksa file ASCII. Saya menggunakan csekarang, tetapi itu tidak optimal untuk skrip ad-hoc, dan tidak bisa interaktif.

Adakah yang tahu alat seperti itu? Tolong, jangan ada perangkat lunak GUI yang klik, perlu bekerja lebih dari ssh, dari skrip lain dan sebagainya. "Tidak ada" adalah jawaban yang dapat diterima, tetapi menyedihkan.


2
Tidak menghilangkan rasa sakit waktu startup, tapi saya menemukan byte dari Python 3.3, bersama dengan timbal sangat bisa diterapkan: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()Sudahkah Anda melihat itu?
Anthon

Anda bisa mengambil kode C yang Anda miliki sekarang dan mengubahnya menjadi seperangkat alat baris perintah yang dapat Anda gunakan dalam skrip bash. Meskipun Anda tidak bisa memasukkan biner ke dalam variabel shell, Anda bisa menyimpannya di pipa bernama ('fifo'); isinya disimpan dalam memori sampai Anda ingin membacanya.
goldilocks

1
Ada kesalahan serius dalam alasan Anda, python dan perl WRT, BTW. Sementara alat-alat baris perintah individual dikompilasi, skrip shell tidak dan melibatkan banyak forking (jika Anda ingin mahal, forking itu). Diskusi Anda, pertanyaan lain, dll, menyiratkan Anda akan baik-baik saja dengan menggunakan bash di sini jika itu bisa menangani biner. Skrip python dan perl keduanya sudah dikompilasi. Jika Anda membandingkan skrip python atau perl yang cukup kompleks dengan skrip bash paralel, perl atau python akan menjadi urutan besarnya lebih cepat . Jika Anda tidak percaya kepada saya, Anda dapat mencari bukti sebaliknya di web.
goldilocks

Saya tidak mencari alat yang berjalan cepat, saya mencari sesuatu yang saya dapat kode cepat. Sebagai contoh, jika saya memiliki program aneh yang menghasilkan sebuah binary int untuk ukuran array struct (int, float, float) yang mengikutinya, saya ingin dengan cepat membaca ukuran array dan loop di atas array, mungkin menghitung beberapa kumulatif atau maksimum beberapa komponen, atau cukup cetak satu komponen sebagai kolom ascii untuk pemrosesan gnuplot. Anthon: terima kasih, saya tidak tahu tentang ini, itu akan berguna. goldilocks: Saya mencoba untuk menghindari itu tetapi saya mungkin hanya menulis alat saya sendiri pada akhirnya :)
orion

2
Terdengar seperti Anda membutuhkan tutorial tentang cara menggunakan perl's unpack(ᵔᴥᵔ)
Stéphane Chazelas

Jawaban:


2

Saya memiliki masalah yang sama persis dengan Anda selama bertahun-tahun juga.

Untuk penggunaan non-interaktif sederhana, saya suka menggunakan editor blok biner BBE . BBE adalah untuk biner karena SED adalah untuk teks, termasuk sintaksis kuno dan kesederhanaannya, namun, ia memiliki banyak fitur yang hilang dari apa yang sering saya butuhkan, jadi saya harus menggabungkannya dengan alat lain. Jadi, BBE hanyalah solusi parsial. Perhatikan juga bahwa BBE tidak memiliki pembaruan atau peningkatan selama bertahun-tahun.

Tentu saja orang dapat menggunakan xxdsebelum dan xxd -rsesudah mengedit data dengan alat berbasis teks, tetapi itu tidak akan berfungsi ketika data yang dimaksud besar dan akses acak diperlukan, misalnya saat memproses perangkat blok.

(Catatan: Untuk Windows, setidaknya ada bahasa scripting WinHex yang mahal dan eksklusif, tetapi itu tidak akan membawa kita ke mana pun.)

Untuk mengedit biner yang lebih rumit, saya biasanya kembali ke Python, meskipun terkadang terlalu lambat untuk file besar, yang merupakan kelemahan utama. Saya harap Pyston (Python menggunakan LLVM untuk mengkompilasi ke kode mesin yang dioptimalkan) suatu hari nanti cukup matang untuk dapat digunakan, atau bahkan lebih baik, seseorang akan merancang dan mengimplementasikan bahasa skrip pemrosesan biner yang ringkas, cepat, dan serbaguna, yang AFAIK tidak ada untuk U * IX belum menyukai sistem.

MEMPERBARUI

Saya juga kebetulan menggunakan homebrew, open source assembler flat assembler Intel x86 , atau singkatnya, yang berkembang menjadi lebih dari sekadar assembler.

Ini memiliki, preprocessor makro berbasis blok teks yang kuat (itu sendiri merupakan bahasa lengkap turing) dengan sintaksis dalam tradisi bahasa makro assembler borland turbo assembler, tetapi jauh lebih maju.

Juga, ia memiliki bahasa manipulasi data, yang memungkinkan untuk biner memasukkan file sewenang-wenang, melakukan semua jenis manipulasi biner dan aritmatika di atasnya (hanya bilangan bulat) pada "waktu kompilasi" dan menulis hasilnya menjadi file output. Bahasa manipulasi data ini memiliki strutures kontrol dan juga turing lengkap.

Ini jauh lebih mudah digunakan daripada menulis program yang melakukan manipulasi biner dalam C dan mungkin bahkan dengan python. Plus, ini memuat sangat cepat, karena ini adalah executable berukuran kecil dengan hampir tidak ada ketergantungan eksternal (Ada 2 versi: baik itu hanya memerlukan libc atau dapat dijalankan sebagai statis yang dapat dieksekusi langsung pada kernel Linux ABI).

Itu memang memiliki beberapa tepi ruff, seperti

  1. tidak mendukung konkurensi

  2. sedang menulis dalam rakitan x86 32 bit (berfungsi pada x86_64), Anda mungkin perlu qemu atau emulator serupa jika Anda ingin menjalankannya di apa pun selain x86 atau x86_64

  3. itu bahasa preprocessor makro yang kuat adalah turing lengkap, ini berarti Anda lebih baik memiliki beberapa pengalaman dengan bahasa seperti Lisp, Haskell, XSLT, atau mungkin M4 akan menjadi pilihan terbaik.

  4. semua data yang akan ditulis ke file output dilakukan dalam buffer "flat" dalam memori, dan buffer ini dapat tumbuh tetapi tidak menyusut sampai file output telah ditulis dan fasm diakhiri. Ini berarti bahwa seseorang hanya dapat menghasilkan file paling besar seperti Anda memiliki memori utama yang tersisa dalam satu menjalankan fasme.

  5. data hanya dapat ditulis ke dalam file output tunggal untuk setiap menjalankan fasme

  6. ya, itu adalah homebrew, yang benar-benar rapi dan pintar


2

Anda tidak harus "berdamai" dengan Perl yang belum dibuka ... salah satu hal hebat tentang perl adalah bagaimana Anda dapat menyalahgunakan parser dan tabel simbol untuk membuat bahasa Anda sendiri, dalam paket khusus.

Apakah ini yang pada dasarnya Anda cari?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

Latihan selanjutnya adalah mempelajari perl yang cukup untuk menulis paket MyBinLib. Tanyakan di forum Perl dan orang-orang mungkin akan dengan senang hati membantu.


1

Apakah Anda menemukan beavmakros, tetapi saya tidak dapat menemukan skrip,

apt-cache show beav ekstrak:

Dengan beav, Anda dapat mengedit file dalam HEX, ASCII, EBCDIC, OCTAL, DECIMAL, dan BINARY. Anda dapat menampilkan tetapi tidak mengedit data dalam mode FLOAT. Anda dapat mencari atau mencari dan mengganti dalam salah satu mode ini. Data dapat ditampilkan dalam format BYTE, WORD, atau DOUBLE WORD. Saat menampilkan KATA atau KATA GANDA data dapat ditampilkan dalam pemesanan byte INTEL atau MOTOROLA. Data dengan panjang berapa pun dapat dimasukkan pada titik mana pun dalam file. Sumber data ini bisa dari keyboard, buffer lain, atau file. Setiap data yang sedang ditampilkan dapat dikirim ke printer dalam format yang ditampilkan. File yang lebih besar dari memori dapat ditangani.

Lalu ada xxdyang mengkonversi ke / dari mode tampilan biner / ascii dan dapat dikombinasikan bersama dengan sedatau vi, tetapi belum mendapatkan fitur byte swapping.


0

Anda selalu bisa mendapatkan emas dan jatuh ke C atau ASM. Jika Anda bekerja dengan biner mentah, cukup bouncing langsung dari register. Anda sudah ada di sana.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.