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.
encoding
language-agnostic
binary
gmadar
źródło
źródło
Odpowiedzi:
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.
źródło
btoa
, czyli od 1990 roku, patenty nie są obciążone, a te i tak z pewnością wygasłyby.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.
źródło
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 .
źródło
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!
źródło
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
m
bajty zawsze mogą kodować don
bajtó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.
źródło
CODES
zmiennej.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.
źródło
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 .
źródło
Sprawdź klasę PHP base128. Kodowanie i dekodowanie za pomocą zestawu znaków ISO 8859-1.
GoogleCode PHP-Class Base128
źródło