İkili işleme için kabuk benzeri bir ortam


15

Bu soru şimdi soruya yanıt olarak, birkaç kez daha önce bana geldi Bash Stdin'den ikili veri parçalar üzerinden döngü verilen Cevaplar /programming/993434/what-language-is-to-binary -as-perl-is-to-text de tatmin edici değildi.

Ben özellikle ikili dosyaları ile G / Ç işlemek için uygun bir komut dosyası ortamı arıyorum. Ben tam teşekküllü programlama dillerinden birini (c / Python / ...) kullanabileceğimi biliyorum ama çok büyük bir başlatma ve kodlama yükü var (c'de tahsis ve fread / fwrite, Python'daki bitstrings ...) komut dosyası oluşturmak için daha az uygundur (diğer uygulamaları çağırır). Perl, unpackfonksiyonları, telli çalışma ve aptal sözdizimi ile daha iyi değil.

Bir şey gibi odama bir dil olarak.

Ne bekliyorum:

  1. endianness'i tek bir anahtar / komut ile ayarlayın veya değiştirin.
  2. istenen türde basit şartname (Bash uzanan gibi bir şey read varile int32 var, float varvs.).
  3. ikili boruların taşınması, belirtilen bayt sayısının atlanması.
  4. alışkın olduğumuz standart kodlama akış kontrolü (/ if / ... için).

ASCII dosyalarını incelerken elde ettiğiniz aynı kolaylığı ve içgörü ile ham verileri (fotoğraf, bilimsel veriler, bilinmeyen ve kötü belgelendirilmiş formatlar) işlemek istiyorum. cŞimdi kullanıyorum , ancak geçici komut dosyası oluşturma için uygun değil ve etkileşimli olamaz.

Böyle bir araç bilen var mı? Hiçbir tıklama GUI yazılımı, lütfen, diğer komut dosyalarından ve benzeri ssh üzerinde çalışması gerekir. "Yok" kabul edilebilir fakat iç karartıcı bir cevaptır.


2
Başlangıç ​​zamanının acısını ortadan kaldırmaz, ancak Python 3.3'ten gelen baytları, plumbum ile birlikte çok işe yarar buluyorum : Buna baktınızchain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain() mı?
Anthon

Şimdi sahip olduğunuz C kodunu alıp bir bash betiğinde kullanabileceğiniz bir dizi komut satırı aracına dönüştürebilirsiniz. İkili bir kabuk değişkenine koyamazken, adlandırılmış ('fifo') borularda saklayabilirsiniz; içeriği okumak istediğinize kadar bellekte tutulur.
goldilocks

1
Akıl yürütmenizde ciddi bir kusur var WRT python ve perl, BTW. Bireysel komut satırı araçları derlenirken, kabuk komut dosyaları çok fazla çatal içermez ve (pahalı istiyorsanız, çatallamadır). Tartışmanız, diğer sorunuz, vb., İkili çalışabiliyorsa burada bash kullanmanın iyi olacağını ima eder. Python ve perl betiklerinin her ikisi de önceden derlenmiştir. Paralel bir bash komut dosyasına kıyasla oldukça karmaşık bir python veya perl komut dosyasını karşılaştırırsanız, perl veya python daha hızlı bir büyüklük sırası olacaktır . Bana inanmıyorsanız, web'de aksini kanıtlamak için arama yapabilirsiniz.
goldilocks

Hızlı çalışan bir araç aramıyorum, hızlı kodlayabileceğim bir şey arıyorum . Örneğin, sonra gelen yapıların (int, float, float) dizi boyutu için bir ikili int çıktı garip bir program varsa, hızlı bir şekilde dizi boyutunu okumak ve dizi üzerinde döngü, muhtemelen bazı hesaplamak istiyorum kümülatif veya maksimum bazı bileşenler veya gnuplot işleme için yalnızca bir bileşeni ascii sütunu olarak yazdırın. Anthon: teşekkür ederim, bunu bilmiyordum, faydalı olacak. goldilocks: Bundan kaçınmaya çalışıyorum ama sonunda kendi aracımı yazabilirim :)
orion

2
Senin gibi Sesler nasıl kullanılacağına ilişkin bir öğretici ihtiyacı perls' unpack(ᵔᴥᵔ)
Stéphane Chazelas

Yanıtlar:


2

Yıllardır senden tamamen aynı sorunu yaşıyorum.

Etkileşimli olmayan basit kullanımlar için ikili blok düzenleyici BBE'yi kullanmayı seviyorum . BBE, arkaik sözdizimi ve basitliği de dahil olmak üzere SED'in metne dönüştüğü için ikilidir, ancak sık sık ihtiyacım olan şeylerden eksik birçok özelliği vardır, bu yüzden diğer araçlarla birleştirmem gerekir. Yani, BBE sadece kısmi bir çözümdür. Ayrıca BBE'nin yıllardır herhangi bir güncelleme veya iyileştirme yapmadığını unutmayın.

Tabii ki , verileri metin tabanlı araçlarla düzenlemeden xxdönce ve xxd -rsonra kullanabilirsiniz , ancak söz konusu veriler büyük ve rastgele erişim gerektiğinde, örneğin blok cihazları işlerken bu işe yaramaz.

(Not: Windows için, en azından maliyetli, tescilli WinHex komut dosyası dili vardır, ancak bu bizi hiçbir yere götürmez.)

Daha karmaşık ikili düzenleme için, bazen büyük dosyalar için çok yavaş olsa da, genellikle dezavantaj olan Python'a geri dönerim. Umarım Pyston (optimize edilmiş makine kodunu derlemek için LLVM kullanan Python), bir gün kullanılabilir olacak kadar olgunlaşacaktır, ya da daha iyisi, birisi AFAIK için mevcut olmayan ücretsiz, hızlı, çok yönlü bir ikili işleme komut dosyası dili tasarlayacak ve uygulayacaktır. Henüz U * IX benzeri sistemler.

GÜNCELLEME

Ayrıca , sadece bir montajcıdan çok daha fazlası olan ev yapımı, açık kaynaklı Intel x86 montajcı düz montajcı veya kısaca fasm kullanıyorum.

Borland turbo birleştirici makro dili geleneğinde bir sözdizimine sahip güçlü, metin bloğu tabanlı bir makro ön işlemciye (kendisi bir turing tam dili) sahiptir, ancak çok daha ileri düzeydedir.

Ayrıca, ikili dosyaları rasgele dosyaları dahil etmeyi, "derleme zamanında" her türlü ikili ve aritmetik manipülasyonu (yalnızca tamsayı) yapmayı ve sonucu bir çıktı dosyasına yazmayı sağlayan bir veri işleme diline sahiptir. Bu veri manipülasyon dili kontrol desteklerine sahiptir ve ayrıca tamamlanmaktadır.

C ve hatta muhtemelen python'da bazı ikili manipülasyonlar yapan bir program yazmaktan çok daha kolaydır. Ayrıca, neredeyse hiç harici bağımlılığı olmayan küçük boyutlu bir yürütülebilir dosya olduğu için kör edici bir şekilde yüklenir (2 sürüm vardır: ya sadece libc gerektirir veya doğrudan Linux çekirdek ABI'de statik bir yürütülebilir olarak çalışabilir).

Bazı ruff kenarları var,

  1. eşzamanlılığı desteklemiyor

  2. 32 bit x86 derlemesinde yazılarak (x86_64 üzerinde çalışıyor), x86 veya x86_64'ten başka bir şeyde çalıştırmak istiyorsanız, muhtemelen qemu veya benzer bir emülatöre ihtiyacınız var.

  3. güçlü makro önişlemci dili tamamlanıyor, bu Lisp, Haskell, XSLT veya muhtemelen M4 gibi dillerde biraz daha iyi bir deneyime sahip olmanız anlamına geliyor.

  4. çıktı dosyasına yazılacak tüm veriler bellekte "düz" bir tamponda gerçekleştirilir ve bu tampon büyüyebilir ancak çıktı dosyası yazılana ve fasm sonlandırılana kadar küçülemez. Bu, bir kişinin yalnızca bir fasm çalıştırmasında ana belleğiniz kadar büyük dosyalar üretebileceği anlamına gelir.

  5. veriler her fasm çalışması için tek bir çıktı dosyasına yazılabilir

  6. evet, homebrew, gerçekten temiz ve zeki bir


2

Perl'in paketini açarken mutlaka "barışmak" zorunda değilsiniz ... perl ile ilgili en güzel şeylerden biri, özel bir pakette kendi dilinizi oluşturmak için ayrıştırıcıyı ve sembol tablosunu nasıl kötüye kullanabileceğinizdir.

Bu temelde aradığınız şey mi?

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;
}

Bu durumda alıştırma MyBinLib paketini yazmak için yeterli perl öğrenmektir. Bir Perl forumunda sorun ve insanlar muhtemelen yardımcı olmaktan mutluluk duyacaktır.


1

Karşılaştığınız beavmakrolar var ama senaryo bulamadım,

apt-cache show beav Ayıkla :

Beav ile HEX, ASCII, EBCDIC, OCTAL, DECIMAL ve BINARY içindeki bir dosyayı düzenleyebilirsiniz. FLOAT modunda verileri görüntüleyebilir ancak düzenleyemezsiniz. Bu modlardan herhangi birini arayabilir veya arayabilir ve değiştirebilirsiniz. Veriler BYTE, WORD veya DOUBLE WORD formatlarında görüntülenebilir. WORDS veya ÇİFT SÖZCÜKLER görüntülenirken veriler INTEL veya MOTOROLA bayt sıralamasında görüntülenebilir. Herhangi bir uzunluktaki veriler dosyanın herhangi bir noktasına eklenebilir. Bu verilerin kaynağı klavye, başka bir arabellek veya bir dosya olabilir. Görüntülenen tüm veriler, görüntülenen biçimde bir yazıcıya gönderilebilir. Bellekten daha büyük dosyalar işlenebilir.

Sonra xxdikili / ascii görüntüleme moduna / modundan dönüştüren ve sedveya ile birleştirilebilen vi, ancak bayt değiştirme özelliğine sahip olmayan var.


0

Her zaman altını seçebilir ve C veya ASM'ye bırakabilirsiniz. Ham ikili ile çalışıyorsanız, kayıt defterinden hemen çıkın. 'Zaten oradasın'.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.