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.
51
Odpowiedzi:
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
).źródło
Ponieważ otworzyłeś go w edytorze tekstu , a nie w edytorze binarnym .
źródło
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.
źródło
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ść:
(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:
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”.
źródło
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.
źródło