Dlaczego nie widzisz kodu binarnego po otwarciu pliku binarnego za pomocą edytora tekstu?

51

Dlaczego nie widzisz kodu binarnego po otwarciu pliku binarnego za pomocą edytora tekstu? Na przykład, kiedy otwieram obraz w edytorze tekstu, widzę dziwne znaki, a także znaki czytelne dla ludzi; ale obraz powinien być zakodowany w formacie binarnym.

templariusz
źródło
8
Czego się spodziewałeś? Jak według Ciebie należy to zarchiwizować?
Nikodemus RIP,
2
Zastanawiam się, dlaczego więcej edytorów nie oferuje pliku binarnego jako nieprzetworzonych sekwencji 1/0 ASCII.
Xeoncross,
7
@ Xenocross: ponieważ nieprzetworzona sekwencja 0/1 jest bezużyteczna, jest zbyt nieporęczna do ręcznego dekodowania, ponieważ zajmuje dużo miejsca na ekranie; Wyświetlanie szesnastkowe jest ogólnie lepsze w przypadku dekodowania ręcznego. Po pewnym szkoleniu możesz szybko i łatwo przetłumaczyć hex na binarne i odwrotnie.
Lie Ryan,
3
@Fiasco Labs: Pedantry: jeden numer szesnastkowy z dwiema cyframi - 00 na FF, co przekłada się na dziesiętne 0 - 255 (8 bitów reprezentujących 2 ^ 8 = 256 możliwych stanów).
Piskvor
1
@Piskvor - Dzięki za umieszczenie go lepiej niż ja. Deadbeef to liczba szesnastkowa z 8 cyframi, dla przypomnienia. ; ^)
Fiasco Labs

Odpowiedzi:

83

Dane binarne i tekstowe nie są rozdzielane: są po prostu danymi . To zależy od interpretacji, która czyni je jedną lub drugą. Jeśli otworzysz dane binarne (takie jak plik obrazu) w edytorze tekstu, wiele z nich nie będzie miało sensu, ponieważ nie pasuje do wybranej interpretacji (jako tekstu).

To, co nazywasz tekstem, jest podzbiorem możliwej zawartości pliku: Dane, które w danym zestawie znaków tłumaczą się na czytelne znaki.

Na przykład w ASCII widać, że spośród 128 „dozwolonych” wartości, tylko około połowa to litery i cyfry, 30 to znaki interpunkcyjne, a reszta to znaki kontrolne . Ta ostatnia grupa po prostu nie jest często używana w plikach tekstowych i nie mają naprawdę dobrej reprezentacji tekstowej. Niektóre z nich to znaki tabulacji i nowego wiersza , w których edytory tekstu muszą już wykazać się kreatywnością w ich wyświetlaniu.

Niektóre edytory tekstu mają opcje jawnego wyświetlania białych znaków. Następnie zostaną narysowane jako znaki, oprócz zwykłego formatowania (co jest również interpretacją tych znaków).

Czysty ASCII interpretuje tylko 128 wartości. Każda z bajtów używanych do przechowywania tych informacji ma 256 możliwych wartości, więc połowa możliwych wartości nie jest dozwolona w ASCII. Są one używane np. W zestawach znaków specyficznych dla regionu, takich jak Latin 1, ale w ASCII są niezdefiniowane. Nie mają użytecznej reprezentacji w przeglądarce tekstu, która obsługuje tylko ASCII.


Dane binarne zwykle nie są interpretowane jako tekst. Tak więc w tych plikach powszechnie można znaleźć wszystkie możliwe wartości bajtów . Wszystko inne byłoby marnotrawstwem (i dlatego bardzo dobrze kompresujesz tekst). Formaty plików graficznych są skomplikowane i zwykle nie wyświetla się ich jako tekstu, więc nie muszą być czytelne.

Ponieważ nie ma wspólnej interpretacji danych (zestawu znaków), która odwzorowuje wszystkie możliwe wartości na czytelne znaki, a ponieważ i tak nie miałoby to większego sensu (ponieważ nie jest to czytelny tekst), główne części są wyświetlane jako bełkot.


Edytor szesnastkowy wybiera inną reprezentację danych: wyświetla każdy bajt jako dwie cyfry szesnastkowe . To tylko inna reprezentacja i jedna z zestawem znaków czytelnym dla człowieka: wszystkie 256 możliwych wartości bajtów może być reprezentowanych jako dwie cyfry szesnastkowe.

Ponieważ istnieje łatwe odwzorowanie danych binarnych na szesnastkowe i odwrotnie (4 cyfry binarne na / z jednej cyfry szesnastkowej), a dane binarne zawierają bardzo mało informacji na cyfrę, szesnastkowy jest ogólnie preferowanym sposobem odczytywania danych binarnych przez ludzi, chyba że istnieją konkretne powody, dla których wolę inną reprezentację.


Niektóre edytory tekstu mogą mieć tryb edytora szesnastkowego, a niektóre heurystyczne, które próbują ustalić, czy plik jest tekstowy czy binarny, i automatycznie wybrać jeden tryb lub drugi. Ale może być trudno to naprawić i nie jest to konkretna właściwość pliku, która mówi, czy jest to jeden czy drugi rodzaj.


Niektórzy klienci FTP proszą o określenie, które zakończenia plików mają być używane dla danych tekstowych . Programy te zmienią następnie zawartość pliku, aby pasowała do systemu operacyjnego komputera, do którego jesteś podłączony, ponieważ Windows używa innej sekwencji znaków kończących wiersz ( CR/LF) niż Linux i Unix (w tym Mac OS X; LF).

Daniel Beck
źródło
4
Ughh, LF ugryzł mnie więcej razy niż pamiętam.
surfasb
32

Ponieważ otworzyłeś go w edytorze tekstu , a nie w edytorze binarnym .

Ignacio Vazquez-Abrams
źródło
22
Jak widzieliście, tekst.
Ignacio Vazquez-Abrams
1
Tekst jako reprezentacja liczb szesnastkowych (0-f) ułożonych w pary (bajty). Jeśli chcesz binarny, zamień heks na binarny w bezsensownym ciągu zer i jedynek. Hex jest bardziej czytelny dla człowieka i łatwiejszy do zrozumienia.
Fiasco Labs,
2
Muszę powiedzieć, że: ktoś powinien zrobić śmiały krok, aby wydać edytor binarny z Ones i Zeros (a następnie być może osobne panele z powiązanymi transliteracjami hex / char / dec) wyłącznie w celu nauczenia tego rodzaju rzeczy. Wiem, że nie powinni, ale popularne media i nauczyciele matematyki udający, że znają się na komputerach, źle spelnili wszystkie oczekiwania chętnych dzieci chętnych do nauki.
ZJR,
@ZJR: Nie ma powodu, żeby nie mieli. Wiele edytorów szesnastkowych pozwala przeglądać zawartość pliku w formacie binarnym. Programiści po prostu nie uważają go za tak przydatny jak widok szesnastkowy, więc nie słyszysz o nim zbyt wiele.
David Z
16

Wszystko dotyczy kontekstu i interpretacji. W twoim komputerze są wzory wysokiego i niskiego napięcia lub namagnesowane obszary dysku, które zyskują znaczenie dopiero wtedy, gdy zdecydujemy, jak je interpretować.

W różnych okolicznościach wzorzec niski-wysoki-niski-niski-niski-niski-niski-wysoki może oznaczać cyfrę 65, wielką literę „A”, kolor niebieski, że klient zamówił kawę, data „marzec” 6th lub cokolwiek, naprawdę.

Po otwarciu pliku obrazu w programie graficznym wie, że interpretuje go jako obraz, wie, które wzorce wskazują format obrazu, które wzorce wskazują rozmiar obrazu i tak dalej.

Gdy otworzysz plik obrazu w edytorze tekstu, zostanie on potraktowany jako tekst. Jest to bardzo prosty format, znacznie bliższy temu, co naprawdę dzieje się na komputerze, ale wciąż trwa interpretacja. W szczególności prawie każdy wzór jest interpretowany jako konkretny znak, niektóre normalne jak AZ, ale także niektóre dziwne znaki. Kilka wzorów nie pojawia się jako znaki, ale jest traktowane jako podstawowe formatowanie: nowa linia, tab.

(Sytuację nieco komplikują takie rzeczy, jak Unicode i kodowanie tekstu, takie jak UTF-8, ale ze względu na prostotę nie zajmę się nimi tutaj.)

Gdy masz otwarty plik binarny w edytorze tekstu, uważaj, aby nie wprowadzać zmian, ponieważ prawie każda wprowadzona zmiana całkowicie zakłóci normalną interpretację zawartości pliku, tzn. Zniszczy plik i uniemożliwi jego użycie.

Andrew Turner
źródło
3

Jako uproszczony przykład rozważmy plik obrazu otwarty za pomocą edytora tekstu.

Obraz jest prostym wzorem szachowym, z kwadratami o szerokości 3 pikseli i 1-pikselową szarą ramką między każdym kwadratem. - trzy czarne piksele, szary piksel graniczny, trzy białe piksele, szary piksel graniczny, powtórz.

Pierwszy wiersz tego obrazu miałby cztery razy następującą wartość:

Black    Black    Black    Gray     White    White    White    Gray
0x000000 0x000000 0x000000 0x7F7F7F 0xFFFFFF 0xFFFFFF 0xFFFFFF 0c7F7F7F

(W trybie szesnastkowym zamiast binarnym - ciąg w binarnym byłby cztery razy dłuższy - 0x7F zastąpione przez 0b01111111)

Jeśli załadujesz ten ciąg danych do edytora tekstowego, otrzymasz następujący tekst:

[Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Del] [Del] [Del] [Blank] [Blank] [Blank] [Blank] [Blank ] [Blank] [Blank] [Blank] [Blank] [Del] [Del] [Del]

Wynika to z faktu, że 0x00 to kod ASCII dla wartości Null i musisz napisać to 3 razy, aby uzyskać wartość czarnego piksela (w każdym razie 24-bitowym BMP) i masz 3 czarne piksele. Zatem 0x7F jest kodem ASCII dla Usuń i potrzebujesz TO trzy razy, aby uzyskać szary piksel. 0xFF nie jest wartościowym kodem ASCII dla czegokolwiek konkretnego - nawet w rozszerzonym zestawie ASCII - i musisz napisać go 9 razy, aby uzyskać 3 białe piksele. Kończąc, dostajesz jeszcze trzy Usunięcia, aby napisać szary piksel.

Innym sposobem na pokazanie tego, który może być bardziej użyteczny, jest odwrotny przykład - co musisz napisać do pliku, aby uzyskać zera i jedynki po otwarciu w edytorze tekstu?

Oczywiście kody ASCII zero i jeden! Zero w edytorze tekstu nie jest przechowywane jako pojedynczy bit o wartości 0, jest zapisywany jako 8 bitów o wartości 0b00110000 lub w wartości szesnastkowej 0x30

Kod ASCII dla „0” to 0x30, a kod ASCII dla „1” to 0x31, więc jeśli chcesz zapisać wzór szachowy jako zera i jedynki, twój plik będzie wyglądał następująco:

text editor:
10101010
01010101
10101010
01010101

Stored data (ASCII values for '1', '0' and 'new line'):
0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x0D 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D  0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31

Jest o wiele więcej niż to - pliki zaczynają się i zatrzymują, metadane i wszystkie inne rzeczy, ale lekcja Takehome i odpowiedź na twoje pytanie to:

O ile pierwsze 8 bitów pliku nie ma wartości 0b00110000, edytor tekstu nie napisze „0”, ponieważ jest to kod ASCII dla znaku „0”. O ile pierwsze 8 bitów pliku to 0b00110001, edytor tekstowy nie napisze „1”, ponieważ jest to kod ASCII dla znaku „1”.

medivh
źródło
0

Edytor nie jest wystarczająco inteligentny, aby stwierdzić, czy jakiś tekst ma sens, czy nie, dlatego wyświetla dowolny plik jako tekst, chyba że wyraźnie powiedziano inaczej, jeśli ma taką funkcję. Jak zauważyli inni, niektórzy redaktorzy mają funkcję wyświetlania heksadecymalnego.

Emilio M. Bumachar
źródło
UltraEdit jest wystarczająco inteligentny - przełącza się na tryb edycji szesnastkowej dla takich plików.
Peter Mortensen