Środowisko podobne do powłoki do przetwarzania binarnego

15

To pytanie przychodziło mi kilka razy wcześniej, teraz w odpowiedzi na pytanie Pętla przez fragmenty danych binarnych ze standardowego wejścia w Bash Odpowiedzi podane w /programming/993434/what-language-is-to-binary -as-perl-is-to-text również nie były zadowalające.

Szukam środowiska skryptowego przystosowanego specjalnie do obsługi operacji wejścia / wyjścia z plikami binarnymi. Wiem, że mogę używać jednego z pełnoprawnych języków programowania (c / Python / ...), ale mają one ogromny narzut inicjowania i kodowania (alokacja i fread / fwrite wc, ciągi bitów w Pythonie ...), nie wspominając o są mniej odpowiednie do skryptowania (wywoływania z niego innych aplikacji). Perl nie jest lepszy dzięki swoim unpackfunkcjom, operacjom zorientowanym na łańcuch i głupkowatą składnię.

Coś jak od, ale jako język.

Czego oczekuję:

  1. ustaw lub zmień endianność za pomocą jednego przełącznika / polecenia.
  2. prosta specyfikacja żądanego typu (coś jak rozszerzenie bash read varz int32 var, float varitp.).
  3. obsługa plików binarnych przez potoki, pomijanie określonej liczby bajtów.
  4. standardowa kontrola przepływu skryptów (dla / if / ...), do której jesteśmy przyzwyczajeni.

Chciałbym przetwarzać surowe dane (zdjęcia, dane naukowe, nieznane i słabo udokumentowane formaty) z taką samą łatwością i wglądem, jakie uzyskujesz podczas przeglądania plików ASCII. Używam cteraz, ale nie jest to optymalne dla skryptów ad-hoc i nie może być interaktywne.

Czy ktoś zna takie narzędzie? Proszę, nie klikalne oprogramowanie GUI, musi pracować nad ssh, z innych skryptów i tak dalej. „Nie istnieje” jest akceptowalną, ale przygnębiającą odpowiedzią.

orion
źródło
2
Nie eliminuje to bólu związanego z czasem uruchamiania, ale bajty z Python 3.3 wraz z pionem są bardzo wykonalne: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()czy już na to spojrzałeś?
Anthon
Możesz wziąć kod C, który masz teraz i przekształcić go w zestaw narzędzi wiersza poleceń, których możesz użyć w skrypcie bash. Chociaż nie możesz wstawić pliku binarnego do zmiennej powłoki, możesz ukryć go w nazwanych potokach („fifo”); ich zawartość jest przechowywana w pamięci, dopóki nie chcesz ich przeczytać.
goldilocks,
1
W twoim rozumowaniu pyton i perl, BTW, ma poważną wadę. Podczas gdy poszczególne narzędzia wiersza poleceń są kompilowane, skrypty powłoki nie są i wymagają dużego rozwidlenia (jeśli chcesz drogie, rozwidlanie to jest). Twoja dyskusja, inne pytanie itp. Sugerują, że dobrze byłoby użyć bash tutaj, gdyby mógł on obsługiwać binarny. Python i Perl skrypty są zarówno skompilowane. Jeśli porównamy dość skomplikowany skrypt Pythona lub Perla w porównaniu do równoległego skryptu bash, Perl lub Python będą o rząd wielkości szybsze . Jeśli mi nie wierzysz, możesz przeszukać internet w poszukiwaniu dowodów przeciwnych.
goldilocks,
Nie szukam narzędzia, które działa szybko, szukam czegoś, co mogę szybko kodować . Na przykład, jeśli mam dziwny program, który wypisuje binarne int dla rozmiaru tablicy struktur (int, float, float), które następują po nim, chciałbym szybko odczytać rozmiar tablicy i zapętlić nad nią, prawdopodobnie obliczając niektóre łącznie lub maksymalnie niektórych składników, lub po prostu wydrukuj jeden składnik jako kolumnę ascii do przetwarzania gnuplot. Anthon: dziękuję, nie wiedziałem o tym, przyda się. goldilocks: Staram się tego unikać, ale na koniec mogę napisać własne narzędzie :)
orion 10'14
2
Wygląda na to, że potrzebujesz samouczka na temat używania ( perls unpack)
Stéphane Chazelas,

Odpowiedzi:

2

Od lat mam dokładnie ten sam problem, co ty.

Do prostych nieinteraktywnych zastosowań lubię używać edytora bloków binarnych BBE . BBE ma postać binarną, podobnie jak SED do tekstu, w tym archaiczną składnię i prostotę, jednak brakuje w niej wielu funkcji, których często potrzebuję, więc muszę połączyć to z innymi narzędziami. Tak więc BBE jest tylko częściowym rozwiązaniem. Należy również pamiętać, że BBE od lat nie ma żadnych aktualizacji ani ulepszeń.

Oczywiście można używać xxdprzed i xxd -rpo edycji danych za pomocą narzędzi tekstowych, ale to nie zadziała, gdy dane są duże i wymagany jest losowy dostęp, na przykład podczas przetwarzania urządzeń blokowych.

(Uwaga: w przypadku systemu Windows istnieje co najmniej kosztowny, zastrzeżony język skryptowy WinHex, ale nigdzie nas to nie doprowadzi.)

W przypadku bardziej skomplikowanej edycji binarnej zwykle wracam również do Pythona, chociaż czasami jest on zbyt wolny dla dużych plików, co jest jego główną wadą. Mam nadzieję, że Pyston (Python wykorzystujący LLVM do skompilowania do zoptymalizowanego kodu maszynowego) kiedyś dojrzeje na tyle, aby był użyteczny, a nawet lepiej, ktoś zaprojektuje i wdroży bezpłatny, kompaktowy, szybki i wszechstronny język skryptowy do przetwarzania binarnego, dla którego AFAIK nie istnieje Systemy podobne do U * IX.

AKTUALIZACJA

Zdarza mi się również używać płaskiego asemblera homebrew, open source Intel x86 asembler , lub w skrócie fasm, który ewoluował w coś więcej niż tylko asembler.

Ma potężny, oparty na blokach tekstowych preprocesor makr (sam w sobie pełny język turinga) o składni w tradycji makroregionu Borland Turbo asemblera, ale o wiele bardziej zaawansowany.

Ma także język manipulacji danymi, który pozwala na binarne dołączanie dowolnych plików, wykonywanie na nim wszelkiego rodzaju manipulacji binarnych i arytmetycznych (tylko liczba całkowita) w „czasie kompilacji” i zapisywanie wyniku w pliku wyjściowym. Ten język manipulacji danymi ma struktury kontrolne, a także jest kompletny.

Jest o wiele łatwiejszy w użyciu niż pisanie programu, który wykonuje binarne manipulacje w C, a prawdopodobnie nawet w Pythonie. Ponadto ładuje się on oślepiająco szybko, ponieważ jest to plik wykonywalny o niewielkich rozmiarach prawie bez zewnętrznych zależności (istnieją 2 wersje: albo wymaga tylko libc, albo może działać jako statyczny plik wykonywalny bezpośrednio na jądrze Linux ABI).

Ma pewne krawędzie, takie jak

  1. nie obsługuje współbieżności

  2. pisząc w 32-bitowym zestawie x86 (działa jednak na x86_64), prawdopodobnie potrzebujesz qemu lub podobnego emulatora, jeśli chcesz uruchomić go na czymkolwiek innym niż x86 lub x86_64

  3. jego potężny język preprocesora makr jest w pełni ukończony, co oznacza, że ​​lepiej mieć trochę doświadczenia z takimi językami jak Lisp, Haskell, XSLT lub prawdopodobnie M4 byłby najlepszym wyborem.

  4. wszystkie dane, które mają zostać zapisane w pliku wyjściowym, są wykonywane w „płaskim” buforze w pamięci, a bufor ten może się powiększać, ale nie kurczyć się, dopóki plik wyjściowy nie zostanie zapisany i nie zostanie zakończony FASM. Oznacza to, że można wygenerować tylko najwyżej pliki tak duże, jak w pamięci głównej pozostała pamięć główna.

  5. dane można zapisać tylko w jednym pliku wyjściowym dla każdego uruchomienia Fasm

  6. tak, to homebrew, ale naprawdę schludny i sprytny

Franki
źródło
2

Niekoniecznie musisz „pogodzić się” z rozpakowaniem Perla ... jedną z wielkich zalet Perla jest to, jak możesz wykorzystać parser i tablicę symboli do stworzenia własnego języka, w niestandardowym pakiecie.

Czy to w zasadzie to, czego szukasz?

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

Ćwiczenie polega na tym, aby nauczyć się wystarczająco dużo perla, aby napisać pakiet MyBinLib. Zapytaj na forum Perla, a ludzie prawdopodobnie chętnie Ci pomogą.

M. Conrad
źródło
1

Czy natrafiłeś na beavto, że ma makra, ale nie mogłem znaleźć skryptów,

apt-cache show beav wyciąg :

Za pomocą beav możesz edytować plik w formacie HEX, ASCII, EBCDIC, OCTAL, DECIMAL i BINARY. Możesz wyświetlać, ale nie edytować danych w trybie FLOAT. Możesz wyszukiwać lub wyszukiwać i zamieniać w dowolnym z tych trybów. Dane mogą być wyświetlane w formacie BYTE, WORD lub DOUBLE WORD. Podczas wyświetlania WORDS lub DOUBLE WORDS dane mogą być wyświetlane w kolejności bajtów INTEL lub MOTOROLA. Dane o dowolnej długości można wstawić w dowolnym punkcie pliku. Źródłem tych danych może być klawiatura, inny bufor lub plik. Wszelkie wyświetlane dane można wysłać do drukarki w wyświetlonym formacie. Pliki większe niż pamięć mogą być obsługiwane.

Potem jest to, xxdco konwertuje do / z trybu wyświetlania binarnego / ascii i może być połączone z sedlub vi, ale nie ma funkcji zamiany bajtów.

X Tian
źródło
0

Zawsze możesz sięgnąć po złoto i zejść do C lub ASM. Jeśli pracujesz z surowym plikiem binarnym, po prostu odbij go prosto z rejestru. Jesteś „już tam”.

ćwiek
źródło