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 unpack
funkcjom, operacjom zorientowanym na łańcuch i głupkowatą składnię.
Coś jak od
, ale jako język.
Czego oczekuję:
- ustaw lub zmień endianność za pomocą jednego przełącznika / polecenia.
- prosta specyfikacja żądanego typu (coś jak rozszerzenie bash
read var
zint32 var
,float var
itp.). - obsługa plików binarnych przez potoki, pomijanie określonej liczby bajtów.
- 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 c
teraz, 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ą.
chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()
czy już na to spojrzałeś?perl
sunpack
)Odpowiedzi:
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ć
xxd
przed ixxd -r
po 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
nie obsługuje współbieżności
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
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.
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.
dane można zapisać tylko w jednym pliku wyjściowym dla każdego uruchomienia Fasm
tak, to homebrew, ale naprawdę schludny i sprytny
źródło
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?
Ć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ą.
źródło
Czy natrafiłeś na
beav
to, że ma makra, ale nie mogłem znaleźć skryptów,apt-cache show beav
wyciąg :Potem jest to,
xxd
co konwertuje do / z trybu wyświetlania binarnego / ascii i może być połączone zsed
lubvi
, ale nie ma funkcji zamiany bajtów.źródło
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”.
źródło