Czy przechowywanie danych w postaci zwykłego tekstu zajmuje mniej miejsca niż przechowywanie równoważnej wiadomości w formacie binarnym?

32

Jako programista bardzo mało rozumiem danych binarnych.

Jeśli wezmę zdanie „Witaj świecie.”, Przekonwertuj go na binarny i zapisz jako binarny w bazie danych SQL, wygląda na to, że cyfry 1 i 0 zajęłyby więcej miejsca niż litery. Wydaje mi się, że używanie liter byłoby jak kompresja, w której jeden symbol oznacza wielokrotność.

Ale czy tak to naprawdę działa?

Czy przechowywanie danych w postaci zwykłego tekstu zajmuje mniej miejsca niż przechowywanie równoważnej wiadomości w formacie binarnym?

nieznany z nazwiska
źródło
126
Nie znasz absolutnego minimum, które każdy programista musi wiedzieć o kodowaniu znaków . Na szczęście założyciel tej strony napisał ci artykuł. Przeczytaj to przed ponownym zaprogramowaniem. joelonsoftware.com/2003/10/08/…
Eric Lippert
16
@EricLippert Świetna lektura i lepiej mi się dzięki, dziękuję.
John Doe
4
Polecam także utf8everywhere.org
Basile Starynkevitch
2
Bycie programistą sieci Web nie jest usprawiedliwieniem, aby nie wiedzieć, jak działa kodowanie znaków i dane binarne. Naprawdę musisz udoskonalić swoje umiejętności ...
T. Sar - Przywróć Monikę

Odpowiedzi:

134

Zwykły tekst jest binarny.

Kiedy piszesz Hna dysk twardy, głowica zapisująca nie tnie dwóch pionowych linii i poziomej linii na talerzu, magnetycznie koduje bity 010010001 na talerzu.

Stąd powinno być oczywiste, że przechowywanie danych tekstowych zajmuje dokładnie tyle samo miejsca, co przechowywanie danych binarnych.

Ale zwykły tekst jest tylko jednym 2 szczególnym formatem binarnym

Zwykły tekst można odwracalnie przekształcić w inne formaty binarne. Jedną z powszechnych transformacji jest kompresja, która zwykle skutkuje bardziej zwartą reprezentacją, co oznacza mniej bitów używanych do reprezentowania tej samej informacji.

W zależności od tego, co reprezentujesz jako zwykły tekst, możesz użyć różnych formatów binarnych do przedstawienia tych samych informacji. Może to zajmować więcej miejsca, może zużywać mniej.

Na przykład liczby 5i 1234567mogą być reprezentowane w postaci zwykłego tekstu za pomocą cyfr, co daje następujące sekwencje bitów na dysku 3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

Alternatywnie możesz użyć uzupełnienia 32-bitowego drugiego :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

Która jest mniej zwartą reprezentacją 5, ale bardziej zwięzłą reprezentacją 1234567.

I istnieje dosłownie nieskończona liczba innych reprezentacji, które miałyby różne poziomy zwartości i elastyczności, chociaż w praktyce jest o wiele mniej niż tyle rzeczywistych reprezentacji.


1 Zakładając, że UTF-8. Dokładna sekwencja bitów dla znaku zależy od tego, jakiego konkretnego kodowania używasz.

2 Lub kilka formatów, biorąc pod uwagę różne kodowania .

3 Jeśli zastanawiasz się, jakie są te osiem zer na końcach, musisz wiedzieć, jak długo trwają dane. Opcje w zasadzie sprowadzają się do znacznika (użyłem tego przez bajt zerowy), miejsca przeznaczonego do przechowywania długości (Pascal użył bajtu do przechowywania długości łańcucha) lub stałego rozmiaru (użytego w dopełnieniu kolejnych dwóch przykład).

8bittree
źródło
6
Jedyną niewielką różnicą jest reprezentacja End-of-line, która w Unix / binary zajmuje jeden bajt (LF), podczas gdy w Windows / text zajmuje dwa bajty (CR-LF).
Glenn Randers-Pehrson
97
+1 za „głowica zapisująca nie wycina dwóch pionowych linii i poziomej linii na talerzu .
Tulains Córdova
@BaardKopperud Masz rację! ;)
Tulains Córdova
2
@BaardKopperud Jest / było LightScribe , ale tak naprawdę nie było to przeznaczone do czytania na komputerze, chociaż być może coś takiego jak Google Gogles może odczytać niektóre etykiety LightScribe. Ale robienie tego po stronie przechowywania danych byłoby bardzo interesujące. Przypomina mi piosenki, które mają fantazyjną grafikę, gdy biegną przez oscyloskop .
8bittree
2
@ TulainsCórdova Chociaż maszyny Turinga działają na dowolnym alfabecie, więc teoretycznie mogą pisać litery na taśmie. Tak się składa, że ​​zdecydowaliśmy się na użycie dwóch symboli alfabetu.
ogrodnik
15

Uważam to za świetną zabawę do myślenia. Binarne to nie 1 i 0 w sposobie, w jaki o tym mówisz.

Wyobraź sobie, że istnieje pewna ilość, którą mogę powiedzieć na wiele różnych sposobów:

  • Nine po angielsku
  • Neuf po francusku
  • 9 cyframi arabskimi
  • IX cyframi rzymskimi
  • 1001 w formacie binarnym z cyframi arabskimi
  • on off off on w trybie binarnym z włącz / wyłącz
  • high low low high w formacie binarnym reprezentowanym przez napięcia lub dźwignie, poziomy wody lub ładunek elektryczny ... lub angielskie słowa „wysoki” i „niski”

Wszystkie reprezentują to samo. Chodzi o to, że wartość binarna to nie 1 i 0, to tylko jeden sposób reprezentacji wartości.

Kiedy mówisz o konwersji H na binarną, prawdopodobnie wyobrażasz sobie, że widzisz 10101010 na ekranie - ale to nie jest „binarne”, to jedna cyfra na każdy bit binarny.

Tak, jeśli przekonwertowałeś Hna „binarny”, gdy ludzie zwykle o nim mówią, a następnie przedstawił to cyframi arabskimi, a następnie zapisał go, zajęłoby to więcej miejsca w taki sam sposób, jak konwersja Hnaaitch więcej miejsca.

Ale widzisz, że binarny jest jednym ze sposobów reprezentowania wielkości, dobrze przez logikę mówiącą: „jeśli przekonwertowałem H na binarny i przedstawię go tak high low high low high low high low, że zajmie to 35 znaków! To nawet więcej niż10101010 ! Ale te dwa są„ binarne ” .. więc jak jedno jest większe od drugiego?

Druga strona to się zastanawiać, w jaki sposób Hprzechowywane są przez komputer, a widząc, że Hjest się tylko sposobem reprezentowania ilość - ta sama ilość 72, 01001000lub seventy twoczy kod ASCII H. Co jest odpowiedzią 8bittree, że zwykły tekst jest binarny, ale to ja próbuję pokazać, co to znaczy .

Masz więc trochę wzorca w komputerze 01001000i co to oznacza? Wszystko - o czym można mówić jako liczbę, jako część pliku zip, jako postać, zależy od intencji osoby, która go utworzyła. Jeśli wiesz, że powinien to być zwykły tekst, to pochodzi on z kodowania znaków H-> 01001000i patrzysz w drugą stronę w tabeli kodowania znaków - ASCII, UTF-8, shift-jis itp. I znajdź odpowiednią czcionkę charakter i wychodziH . Lub wychodzi niewłaściwy znak, jeśli użyjesz innego wyszukiwania kodowania niż osoba, która go utworzyła. To jest link @Eric Lippert.

Ale kiedy to piszę i jak o tym myślisz, Hjest to jeden bajt i 01001000ma 8 bajtów, tak, to więcej miejsca. I tak, to (reprezentacja) pliku binarnego. Ale jest na wyższym poziomie abstrakcji niż komputer - plik binarny wyświetlany w postaci znaków ASCII, gdzie każda postać jest reprezentowana za kulisami za pomocą binarnego wzorca bitowego, każdy tak duży jak Hsam.

TessellatingHeckler
źródło
12

Czy przechowywanie danych w postaci zwykłego tekstu zajmuje mniej miejsca niż przechowywanie równoważnej wiadomości w formacie binarnym?

Nie, nigdy.

Twój komputer już przechowuje dane tekstowe w równoważnej reprezentacji binarnej. Przechowywanie czegoś jako zwykłego tekstu w porównaniu do pliku binarnego po prostu sygnalizuje, jak komputer powinien interpretować ten sam strumień binarny.

Wydaje mi się, że używanie liter byłoby jak kompresja, w której jeden symbol oznacza wielokrotność.

To trochę prawda. Jedna postać będzie reprezentować więcej niż jeden bit. Problem polega na tym, że mają różne rozmiary. Zapisanie 1 lub 0 zajmuje tylko jeden bit, ale 8 bitów (lub więcej), aby zapisać znak zwykłego tekstu. Nic nie zyskujesz, używając postaci.

Jeśli już , możesz kompresować rzeczy w drugą stronę. W końcu 8 bitów to 256 różnych możliwych wartości, ale zwykły tekst zwykle ogranicza się do liter, cyfr i kilku znaków interpunkcyjnych. Nie potrzebuje tyle bitów, ile potrzeba.

Telastyn
źródło
3
Cóż, może czasami :-) Mogę wymyślić dwa możliwe przypadki. 1) Masz krótki ciąg tekstowy, który kompresujesz. Skompresowany plik zawiera pewne metadane, co powoduje, że skompresowany plik jest większy niż oryginalny ciąg. 2) Masz pewne wartości zmiennoprzecinkowe, powiedzmy 1.2. Przechowywanie jako tekst zajmowałoby 3 bajty (4 z terminatorem), a przechowywanie podwójnego pliku binarnego zajmowałoby 8 bajtów.
jamesqf
5
Odpowiedź naprawdę zależy od tego, co rozumiesz przez „binarny”. Na przykład, UTF-32 odbywa się cztery razy tyle miejsca co ASCII, więc jeśli przez „zwykły tekst” masz na myśli ASCII, a przez „binarny” chodziło UTF-32, zwykły tekst , że zajmuje mniej miejsca niż binarny. Ale możesz odwrócić definicje i uzyskać przeciwny wynik.
David Conrad
1
@DavidConrad Cóż, to tylko omija „nie ma czegoś takiego jak zwykły tekst”. Najbliższa rzecz to plik binarny bez metadanych / nagłówków identyfikujących typ i zgadujących „tekst musi być zakodowany jako XXX!”. Był czas, kiedy „zwykły plik tekstowy” oznaczał coś rozsądnego, w ograniczonym kontekście, ale tak naprawdę już nie jest. Najlepsze, co możesz uzyskać, to „wszystkie dane w pliku są kodowane jako tekst”, w przeciwieństwie do „niektóre / wszystkie części danych nie są kodowane jako tekst”.
Luaan