Dlaczego base128 nie jest używany? [Zamknięte]

90

Dlaczego tylko base64 zamiast base128 jest używany do przesyłania danych binarnych w Internecie? Zestaw znaków ASCII ma 128 znaków, które teoretycznie mogą reprezentować podstawę 128, ale w większości przypadków używany jest tylko base64, ale nie base128.

gmadar
źródło
60
Dlaczego nawet nie bazuje na 256?
Gumbo
22
Myślę, że chodzi o to, aby znaki drukowalne (chociaż jest ich też więcej niż 64 ...)
Felix Kling
29
Myślę, że baza 128 należała do nas jakiś czas temu. Zespół przydzielony do bazy 64 straży wciąż się trzyma.
Ritch Melton
5
dlaczego to pytanie jest specyficzne dla javascript? dotyczy to również większości innych języków używanych w sieci, prawda?
Benedikt Waldvogel
5
@KenRockot: Widzę, że zdajesz sobie sprawę, że niektóre z Twoich 15-bitowych znaków zostałyby zakodowane w 3 bajty. Twoje kodowanie base-2048 oznacza pakowanie 11 bitów do 2 bajtów, co daje 5,5 bitów na bajt - pół bitów mniej niż base-64.
maaartinus

Odpowiedzi:

105

Problem polega na tym, że co najmniej 32 znaki zestawu znaków ASCII to „znaki sterujące”, które mogą być interpretowane przez terminal odbiorczy. Np. Istnieje znak BEL (dzwonek), który powoduje dzwonienie terminala odbiorczego. Są znaki SOT (Start Of Transmission) i EOT (End Of Transmission), które wykonują dokładnie to, co sugerują ich nazwy. I nie zapomnij o znakach CR i LF, które mogą mieć specjalne znaczenie w sposobie serializacji / spłaszczania struktur danych w strumień.

Firma Adobe stworzyła kodowanie Base85, aby używać większej liczby znaków w zestawie znaków ASCII, ale AFAIK jest chronione patentami.

pepoluan
źródło
7
Base91 wydaje się dobrą opcją open source: base91.sourceforge.net
Jorge Cevallos
2
Warto wziąć pod uwagę, że potęga 2 łatwiej dopasowuje dane bajtowe, a kodowanie jest prostsze. Jest też przenośność; każdy język ma kodowanie base64 i / lub dekodowanie base64.
Lodewijk
5
W odniesieniu do Base85 i Adobe : odpowiedź mogłaby być bardziej użyteczna, gdyby przytoczyła numery patentów i przyznany rok. Jeśli patenty są problemem, to zawsze btoa, czyli od 1990 roku, patenty nie są obciążone, a te i tak z pewnością wygasłyby.
agc,
65

Ponieważ niektórych z tych 128 znaków nie można wydrukować (głównie te, które są poniżej punktu kodowego 0x20). Dlatego nie można ich niezawodnie przesyłać jako struny przez drut. Jeśli przejdziesz powyżej punktu kodowego 128, możesz mieć problemy z kodowaniem z powodu różnych kodowań używanych w różnych systemach.

driis
źródło
8
Base94 istnieje tutaj na githubie, używa wszystkich 94 drukowalnych znaków ASCII: gist.github.com/iso2022jp/4054241
intrepidis
15

Jak już stwierdzono w innych odpowiedziach, kluczową kwestią jest zredukowanie zestawu znaków do drukowalnych . Bardziej wydajnym schematem kodowania jest basE91, ponieważ wykorzystuje większy zestaw znaków i nadal unika sterujących / białych znaków z dolnego zakresu ASCII. Strona internetowa zawiera ładne porównanie wydajności kodowania binarnego, base64 i basE91 .

Kiedyś wyczyściłem implementację Javy. Jeśli ludzie są zainteresowani, mogę to przesłać na GitHub.

Aktualizacja : jest teraz na GitHub .

Benedikt Waldvogel
źródło
Byłbym zainteresowany wersją java
Michael Deardeuff
2
Przesłano
Benedikt Waldvogel
12

To, że pierwsze 32 znaki to znaki kontrolne, nie ma absolutnie żadnego znaczenia, ponieważ nie musisz ich używać, aby uzyskać 128 znaków. Do wyboru mamy 256 znaków, a tylko pierwsze 32 to znaki sterujące. Pozostawia 192 znaki, a zatem 128 jest całkowicie możliwe bez użycia znaków sterujących.

Oto powód: musi to być coś, co będzie wyglądać tak samo i co możesz kopiować i wklejać bez względu na to, gdzie. Dlatego muszą to być znaki, które będą wyświetlane tak samo na każdym forum, czacie, e-mailu i tak dalej. Oznacza to, że nie możemy używać znaków, których klienci forum / czatu / poczty e-mail mogą zwykle używać do formatowania lub ignorowania. Muszą to być również znaki, które są takie same, niezależnie od czcionki, języka i ustawień regionalnych.

To jest powód!

user3119289
źródło
7
Znaki kontrolne są istotne, ponieważ prawie wszyscy zakładali już, że powinna być jak najbardziej neutralna strona kodowa / kodowanie. To koniecznie ogranicza cię do (7-bitowego) ASCII, który jest podzbiorem większości odpowiednich kodowań. Również nie cały internet jest czysty w 8-bitach, a większość z nich to defacto ASCII. Warto jednak zwrócić uwagę.
Tim Seguine,
7
Wystarczy dodać: ASCII definiuje tylko 128 znaków. Znaki od 128 do 255 nie są zdefiniowane w ASCII. Ponieważ pytanie wyraźnie odwołuje się do ASCII, a nie do „jakiegokolwiek 8-bitowego kodowania”, wszystkie odpowiedzi ograniczają się do 128 znaków zestawu ASCII.
pepoluan
Jako przykład posłużę się najpopularniejszym kodowaniem UTF-8: Bajty od 128 do 196 natychmiast spowodowałyby błędy dekodowania UTF8; bajtów od 196 do 256 oznaczałoby, że następny bajt również ma ten sam znak, ale wtedy, jeśli następny bajt ma mniej niż 128, ponownie spowodowałoby to błędy dekodowania UTF8. Jednak prawie wszystkie języki wrażliwe na kodowanie znaków miałyby bibliotekę base64 przyjmującą ciągi base64 jako ciągi bezpieczne dla UTF8. Tego samego nie można zrobić z base128, ponieważ nie można go zakodować jako łańcucha bezpiecznego UTF8.
SOFe
10

Base64 jest powszechny, ponieważ rozwiązuje różne problemy (działa prawie wszędzie, o czym myślisz)

  • Nie musisz się martwić, czy transport jest czysty w 8-bitach, czy nie.

  • Wszystkie znaki w kodowaniu można wydrukować. Możesz je zobaczyć . Możesz je skopiować i wkleić . Możesz ich używać w adresach URL (poszczególne warianty). itp.

  • Naprawiono rozmiar kodowania. Wiesz, że mbajty zawsze mogą kodować do nbajtów.

  • Każdy o tym słyszał - jest szeroko obsługiwany, wiele bibliotek, z którymi łatwo się współpracuje.

Base128 nie ma wszystkich tych zalet.

Wygląda na to, że jest 8-bitowy czysty - ale pamiętaj, że base64 używa 65 symboli. Bez znaku spoza pasma nie możesz mieć korzyści ze stałego rozmiaru kodowania. Jeśli używasz postaci spoza pasma, nie możesz już być czysty 8-bitowo.

Jednak nie wszystko jest negatywne.

  • base128 jest łatwiejszy do kodowania / dekodowania niż base64 - wystarczy użyć przesunięć i masek. Może mieć znaczenie dla wdrożeń osadzonych

  • base128 nieco wydajniej wykorzystuje transport niż base64, wykorzystując więcej dostępnych bitów.

Ludzie zrobić użytku base128 - używam go na coś teraz. To nie jest tak powszechne.

John La Rooy
źródło
Pamiętaj również, że systemy poczty / grup dyskusyjnych i im podobne (a także XML) nie zawsze są przyjazne dla pierwszych 32 punktów kodowych (rozważmy na przykład CR LF vs LF), ale poza tym Twoja odpowiedź wygląda bardzo dobrze.
SamB
„że base64 używa 65 symboli”. => literówka czy coś przeoczyłem?
Kikiwa
@Kikiwa, spójrz na tę próbkę Java na Wikipedii . Sprawdź długość CODESzmiennej.
John La Rooy
O tak, znak dopełniający „=” tylko na końcu ładunku kodowania, masz rację, dzięki.
Kikiwa
4

Nie jestem pewien, ale myślę, że niższe wartości (reprezentujące kody sterujące lub coś w tym rodzaju) nie są niezawodnie przesyłane jako tekst / znaki w żądaniach / odpowiedziach HTTP, a wartości powyżej 127 mogą być specyficzne dla lokalizacji / strony kodowej / czegokolwiek, więc nie ma 128 różnych znaków, które mogą działać we wszystkich przeglądarkach / platformach.

esaj
źródło
3

esaji ma rację. Base64 jest używany do kodowania danych binarnych do transmisji przy użyciu protokołu, który oczekuje tylko tekstu. Jest dokładnie we wpisie Wiki .

Russell Troywest
źródło
2

Sprawdź klasę PHP base128. Kodowanie i dekodowanie za pomocą zestawu znaków ISO 8859-1.

GoogleCode PHP-Class Base128

seizu
źródło
1
Chciałbym, żeby zamiast tego używał utf-8 ...
Janus Troelsen
1
Kodowanie podstawowe nie ma nic wspólnego z danymi źródłowymi. Możesz użyć dowolnego kodowania tekstu, które chcesz zakodować swój tekst / dane. Ma na myśli to, że tabela indeksów Base ## używa zestawu znaków ISO 8859-1 ASCII jako tłumaczenia.
Czad
1
Ma to coś wspólnego z podstawowymi danymi, gdy tylko spróbujesz osadzić w tekście dane binarne zakodowane w bazie. Jeśli ten tekst jest zakodowany w innym kodowaniu, będziesz mieć problemy.
Stijn de Witt,
Nie ma czegoś takiego jak zestaw znaków „ISO 8859-1 ASCII”. Program koduje dane przy użyciu 128 różnych drukowalnych znaków ISO 8859-1. Nie używa ASCII w żaden sposób, w żadnym kształcie ani formie.
Nisse Engström