Jak wyświetlić plik binarny?


45

Z tego, co rozumiem, kompilator tworzy plik binarny, który składa się z 1 i 0, które procesor może odczytać. Mam plik binarny, ale jak mogę go otworzyć, aby zobaczyć jedynki i zera? Edytor tekstów mówi, że nie można go otworzyć ...

PS Mam skompilowany plik binarny zestawu, który powinien być zwykłym kodem binarnym 1 i 0?


1
kiedy wyświetlisz plik binarny, zobaczysz go jako znaki ascii
mazs


nie - określono „OP skompilowany plik binarny”. To nie dotyczy pytania. Na przykład nie jest to plik muzyczny i ma strukturę. Bez PO dostarczającego dodatkowych informacji, od samego początku można zacząć od nieustrukturyzowanego narzędzia.
Thomas Dickey,

1
Zobacz moją odpowiedź. I ostrzegamy, że w praktyce termin binarny jest używany na dwa sposoby: „Plik binarny” oznacza plik, którego kontekst nie jest czystym tekstem ASCII. „Liczba binarna” oznacza liczbę zapisaną za pomocą jej postaci binarnej.
Pierre-Olivier Vares,

@mazs ASCII? Myślę, że UTF-8 jest bardziej prawdopodobne, lub jakaś strona kodowa, jeśli program myśli, że wydaje się być zakodowany w ten sposób przez huragan.
JDługosz

Odpowiedzi:


99

Według tej odpowiedzi przez Tyranid :

hexdump -C yourfile.bin 

chyba że chcesz go oczywiście edytować. Większość dystrybucji Linuksa ma hexdumpdomyślnie (ale oczywiście nie wszystkie).


Aktualizacja

Według tej odpowiedzi przez Emilio Bool :

xxd robi zarówno binarny, jak i szesnastkowy

Do kosza:

xxd -b file

Dla heksadecymalnego:

xxd file

To naprawdę pomogło! Dziękuję
Shravya Boggarapu

45

Różne osoby odpowiedziały na niektóre aspekty zapytania, ale nie na wszystkie.

Wszystkie pliki na komputerach są przechowywane jako 1 i 0. Obrazy, pliki tekstowe, muzyka, aplikacje wykonywalne, pliki obiektowe itp.

Wszystkie są zerami i jedynkami. Jedyna różnica polega na tym, że są one interpretowane różnie w zależności od tego, co je otwiera.

Gdy przeglądasz plik tekstowy przy użyciu cat, plik wykonywalny ( catw tym przypadku) odczytuje wszystkie jedynki i zera oraz przedstawia je, konwertując je na znaki z odpowiedniego alfabetu lub języka.

Kiedy przeglądasz plik za pomocą przeglądarki obrazów, bierze wszystkie jedynki i zera i zamienia je w obraz, w zależności od formatu pliku i pewnej logiki, aby wszystko wypracować.

Skompilowane pliki binarne nie różnią się, są przechowywane jako 1 i 0.

Odpowiedź arzyfex daje narzędzia do przeglądania tych plików na różne sposoby, ale czytanie pliku jako pliku binarnego dla dowolnego pliku na komputerze, podobnie jak wyświetlanie go w postaci ósemkowej, szesnastkowej lub ASCII, może nie mieć sensu w każdym tych formatów.

Jeśli chcesz zrozumieć, co robi wykonywalny plik binarny, musisz go wyświetlić w sposób pokazujący język asemblera (na początek), który możesz zrobić, używając:

objdump -d /path/to/binary

który jest deasemblerem, pobiera zawartość binarną i konwertuje ją z powrotem na asembler (który jest językiem programowania na bardzo niskim poziomie). objdumpnie zawsze jest instalowany domyślnie, więc może być konieczne zainstalowanie go w zależności od środowiska Linux.

Niektóre zewnętrzne czytanie.

Uwaga: jak wskazuje @Wildcard, należy pamiętać, że pliki nie zawierają znaków 1 i 0 (jak widać na ekranie), zawierają rzeczywiste dane liczbowe, poszczególne fragmenty informacji, które są albo na (1) lub wyłączone (0). Nawet ten opis jest jedynie przybliżeniem prawdy. Kluczową kwestią jest to, że jeśli znajdziesz przeglądarkę, która pokazuje jedynki i zera, nawet to nadal interpretuje dane z pliku, a następnie pokazuje znaki ASCII dla 0 i 1. Dane są przechowywane w formacie binarnym ( patrz link Numer binarny powyżej). Wpis wiki społeczności Pierre-Oliviera opisuje to bardziej szczegółowo.


Dobry exposé. Możesz dodać, że znaki, które widzisz w wierszu tekstu jako „1” lub „0”, nie są zapisywane przez komputer jako pojedyncze „1” lub „0”; OP wydaje się mieć co do tego zamieszanie.
Wildcard

1
Chciałbym sprzeciwić się (tj. Nie zgodzić się) z twoim stwierdzeniem: „Gdy przeglądasz plik tekstowy przy użyciu cat, plik wykonywalny ( catw tym przypadku) odczytuje wszystkie jedynki i zera i przedstawia je, konwertując je na znaki z odpowiedniego alfabetu lub język." catnie robi tego; wszystko co catrobi to zapisywanie bajtów na standardowe wyjście (chyba że używasz opcji „szkodliwych” ). Program terminala (i / lub sprzęt terminala, jeśli dotyczy, tj. Jego oprogramowanie układowe) określa sposób renderowania bajtów jako znaków, prawdopodobnie przy pomocy sterownika TTY.
G-Man mówi „Reinstate Monica”

Nie zgadzam się, ale w pewnym momencie wszystkie proste opisy się psują, pytanie brzmi, jak daleko schodzisz do króliczej nory, zanim przestaniesz po prostu opisywać rzeczy.
EightBitTony

14

Na niskim poziomie plik jest kodowany jako sekwencja zer i jedynek.

Ale nawet programiści rzadko tam chodzą w praktyce.

Po pierwsze (i ważniejsze niż ta historia zer i jedynek) musisz zrozumieć, że wszystko, czym manipuluje komputer, jest kodowane liczbami .

  • Znak jest kodowany liczbą przy użyciu tabel zestawu znaków. Na przykład litera „A” ma wartość 65 po zakodowaniu za pomocą ASCII. Zobacz http://www.asciitable.com

  • Piksel jest kodowany za pomocą jednej lub więcej liczb (istnieje wiele formatów graficznych). Na przykład w standardowym formacie 3 kolorów żółty piksel jest kodowany jako: 255 dla czerwonego, 255 dla zielonego, 0 dla niebieskiego. Zobacz http://www.quackit.com/css/css_color_codes.cfm (wybierz kolor i zobacz komórki R, G i B)

  • Plik wykonywalny binarnie zapisywany jest w asemblerze; każda instrukcja montażu jest kodowana jako liczby. Na przykład instrukcja asemblacji MOVB $0x61,%aljest kodowana dwoma liczbami: 176,97 Patrz http://www.sparksandflames.com/files/x86InstructionChart.html (Każda instrukcja ma przypisany numer od 00 do FF, ponieważ używana jest notacja szesnastkowa, patrz poniżej)

Po drugie : każda liczba może mieć wiele reprezentacji lub notatek .

Powiedz, że mam 23 jabłka.

  • Jeśli zrobię grupy dziesięciu jabłek, dostanę: 2 grupy dziesięciu i 3 samotne jabłka. Dokładnie to mamy na myśli, gdy piszemy 23: 2 (dziesiątki), a następnie 3 (jednostki).
  • Ale mogę też zrobić grupy 16 jabłek. Więc wezmę jedną grupę 16-osobową i 7 samotnych jabłek. W notacji szesnastkowej (tak nazywa się 16 podstawnikiem) napiszę: 17 (16 + 7). Aby odróżnić notację dziesiętną, notacja szesnastkowa jest zazwyczaj zapisywana z prefiksem lub sufiksem: 17h, # 17 lub 17 $. Ale jak reprezentować więcej niż 9 grup po 16 lub więcej 9 samych jabłek? Po prostu używamy liter od A (10) do F (15). Liczba 31 (jak w 31 jabłkach) jest zapisywana jako # 1F w systemie szesnastkowym.

  • Na tej samej linii możemy zrobić grupę dwóch jabłek. (I grupa dwóch grup dwóch jabłek, tj. Grupa 2x2 jabłek i tak dalej). Zatem 23 to: 1 grupa-2x2x2x2-jabłek, 0 grupa-2x2x2-jabłek, 1 grupa-2x2x-jabłek, 1 grupa 2 jabłek i 1 samotne jabłko, które zostanie odnotowane 10111 w systemie dwójkowym.

(Zobacz https://en.wikipedia.org/wiki/Radix )

Fizycznie mechanizmy pozwalające na dwa stany (przełączniki) są łatwe do wykonania, jak również na dysku, który jest w pamięci.

Dlatego dane i programy, traktowane jako liczby, są zapisywane i przetwarzane w formie binarnej.

Następnie przetłumaczone - w zależności od typu danych - na odpowiednią formę (litera A, żółty piksel) lub wykonane (instrukcja MOV).

hexdumpwyświetla liczby kodujące dane (lub program asemblacyjny) w postaci szesnastkowej. Następnie można użyć kalkulatora, aby uzyskać odpowiednią formę binarną.



4

Możesz go otworzyć w edytorze szesnastkowym, który pokazuje go jako ciąg wartości szesnastkowych. xxd file

Co próbujesz osiągnąć


Ale myślałem, że komputer może odczytywać tylko 1 i 0. Czy mogę to zobaczyć? Próbuję zrozumieć, jak działają komputery
Martin Zeltin

2
Samo to niewiele ci pomoże. Jeśli chcesz dowiedzieć się, jak to dokładnie działa, to na Linux-ie spójrz na format pliku ELF i en.wikipedia.org/wiki/X86_instruction_listings . Jeśli chcesz tylko zobaczyć kod generowany przez kompilator, spójrz na uruchomienie go za pomocą gdb. Ponieważ chcesz uzyskać więcej „niskiego poziomu”, sprawdź także nand2tetris.org. Jeśli chodzi o język asemblera, słyszę, że asemblowanie 6502 i mips jest o wiele ładniejsze niż
asemblowanie

@theblazehen Nowoczesny asembler z rodziny x86 to bestia. 8086 był zarządzalny i myślę, że każdy procesor z tamtej epoki (od końca lat siedemdziesiątych do pierwszej połowy lat osiemdziesiątych) powinien być tolerowany, jeśli chodzi o asembler.
CVn

4

bvijest edytorem Binary VIsual z skrótami klawiszowymi vim. Jest dostępny w większości systemów Linux.

wprowadź opis zdjęcia tutaj


3

Komenda Linux strings drukuje ciągi znaków do wydrukowania w plikach, np .:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

itp ... jest o wiele bardziej czytelny niż binarny.


OP zapytał, jak go otworzyć, aby zobaczyć jedynki i zera, które tam są? ale stringspolecenie usunie większość bajtów, które chce zobaczyć.
jlliagre

@jlliagre - gdy masz rację, stringspolecenie - zwłaszcza o dłuższej długości strings -n 6- naprawdę pomaga dowiedzieć się, co zawiera plik binarny, jeśli zawiera on stałe ciągów itp. Ta odpowiedź powinna być komentarzem, a następnie było dobrze.
Joe

@Joe Tak, nie kwestionuję stringsprzydatności polecenia, tylko fakt, że nie odpowiada tutaj pytanie OP.
jlliagre

3

Ważna część, o której nadal się mylisz: Wartości szesnastkowe to po prostu inna reprezentacja wartości binarnych. Większość edytorów szesnastkowych lub zrzutów szesnastkowych wyświetla wartości w bazie szesnastkowej, ponieważ jest ona bardziej czytelna niż w bazie binarnej.

Na przykład:

Dwójkowy:

xxd -b README.md                                                                
00000000: 00100011 00100000

Czyli 35 i 32 w systemie dziesiętnym

xxd README.md                                                                   
00000000: 2320

Również 35 i 32 w systemie dziesiętnym


Inni ludzie nie wspomniał o tym. To jednak dobre podsumowanie. Możesz edytować swoją odpowiedź, jeśli chcesz zmienić pierwszy akapit.
wizzwizz4

Bardzo dobrze, nie widziałem, żeby ktoś o tym wspominał, mogłem to przegapić.
czwartek, następny

Pamiętaj, że musisz go vimzainstalować xxd.
starbeamrainbowlabs

2

Możesz wyświetlić plik w formacie binarnym w vim:

  • Otwieranie pliku w vim
  • Wstępowanie :% !xxd -b

xxdPolecenie to może być modyfikowane dalej, na przykład:

  • Dodając -g4, który zgrupuje bity w pakietach 32-bitowych
  • Dodając -c4, który sformatuje dane wyjściowe, aby mieć 4 bajty na linię

Dodanie obu powyższych flag da jedną 32-bitową liczbę całkowitą na linię.


1

Możesz to zrobić np. Za pomocą tej rubinowej jednowarstwowej:

$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

Tradycyjny system oparty na C ma kiepską obsługę wysyłania plików w formacie binarnym, AFAIK. Zwykle nie jest bardzo przydatny, ponieważ jest trudny do odczytania w przeciwieństwie do zrzutów szesnastkowych.


Dzięki! Dodanie spacji bezpośrednio po %08bpowoduje zgrupowanie danych wyjściowych w bajty.
starbeamrainbowlabs

0

GHex jest twoim przyjacielem :)
Możesz zainstalować go za pomocą wiersza poleceń

Ubuntu:

sudo apt-get install ghex

Fedora:

sudo mniam zainstaluj ghex

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.