A propos, oto podstawowy konwerter do dowolnej konwersji bazowej, który dla Ciebie stworzyłem. Cieszyć się!
https://convert.zamicol.com/
Co to są znaki dopełniające?
Znaki dopełniające pomagają spełnić wymagania dotyczące długości i nie mają znaczenia.
Dziesiętny przykład dopełnienia:
biorąc pod uwagę dowolne wymaganie, aby wszystkie ciągi miały długość 8 znaków, liczba 640 może spełnić to wymaganie, używając poprzedzających 0 jako znaków dopełniających, ponieważ nie mają one znaczenia „00000640”.
Kodowanie binarne
Paradygmat bajtów: bajt jest de facto standardową jednostką miary, a każdy schemat kodowania musi odnosić się z powrotem do bajtów.
Base256 dokładnie pasuje do tego paradygmatu. Jeden bajt to jeden znak w base256.
Base16 , szesnastkowy lub szesnastkowy, wykorzystuje 4 bity na każdy znak. Jeden bajt może reprezentować dwa znaki base16.
Base64 nie pasuje równomiernie do paradygmatu bajtów (ani base32), w przeciwieństwie do base256 i base16. Wszystkie znaki base64 mogą być reprezentowane w 6 bitach, 2 bity krótkie od pełnego bajtu.
Możemy przedstawić kodowanie base64 w porównaniu z paradygmatem bajtów jako ułamek: 6 bitów na znak w 8 bitach na bajt . Zmniejszono ten ułamek o 3 bajty ponad 4 znaki.
Ten współczynnik, 3 bajty na każde 4 znaki base64, jest regułą, której chcemy przestrzegać podczas kodowania base64. Kodowanie Base64 może obiecać tylko pomiary z pakietami 3-bajtowymi, w przeciwieństwie do base16 i base256, gdzie każdy bajt może stać sam.
Dlaczego więc zachęca się do wypełniania, mimo że kodowanie mogłoby działać dobrze bez znaków wypełniających?
Jeśli długość strumienia jest nieznana lub jeśli może być pomocne dokładne poznanie końca strumienia danych, użyj dopełnienia. Znaki wypełniające wyraźnie informują, że te dodatkowe miejsca powinny być puste, i wyklucza jakąkolwiek dwuznaczność. Nawet jeśli długość jest nieznana z dopełnieniem, będziesz wiedzieć, gdzie kończy się strumień danych.
Jako kontrprzykład, niektóre standardy, takie jak JOSE , nie pozwalają na dopełnianie znaków. W takim przypadku, jeśli czegoś brakuje, podpis kryptograficzny nie będzie działał lub będzie brakować innych znaków spoza base64 (np. „.”). Chociaż założenia dotyczące długości nie są poczynione, wypełnienie nie jest potrzebne, ponieważ jeśli coś jest nie tak, po prostu nie zadziała.
Dokładnie tak mówi dokument RFC dotyczący base64 :
W niektórych przypadkach użycie dopełnienia („=”) w danych zakodowanych w oparciu o zasady nie jest wymagane ani używane. W ogólnym przypadku, gdy nie można przyjąć założeń dotyczących rozmiaru transportowanych danych, wymagane jest wypełnienie, aby uzyskać prawidłowe zdekodowane dane.
[…]
Krok dopełniania w bazie 64, jeśli [...] jest nieprawidłowo zaimplementowany, prowadzi do nieznaczących zmian w zakodowanych danych. Na przykład, jeśli dane wejściowe to tylko jeden oktet dla podstawowego kodowania 64, wówczas używane są wszystkie sześć bitów pierwszego symbolu, ale używane są tylko pierwsze dwa bity następnego symbolu. Te bity wypełnienia MUSZĄ być ustawione na zero przez zgodne kodery, co jest opisane w opisach wypełnienia poniżej. Jeśli ta właściwość nie jest zachowana, nie ma kanonicznej reprezentacji danych zakodowanych w oparciu o zasady, a wiele ciągów zakodowanych w oparciu o zasady może być zdekodowanych na te same dane binarne. Jeśli ta właściwość (i inne omówione w tym dokumencie) jest zachowana, gwarantowane jest kodowanie kanoniczne.
Dopełnienie pozwala nam dekodować kodowanie base64 z obietnicą braku utraconych bitów. Bez wypełnienia nie ma już wyraźnego potwierdzenia pomiaru w pakietach trzech bajtów. Bez dopełnienia możesz nie być w stanie zagwarantować dokładnego odtworzenia oryginalnego kodowania bez dodatkowych informacji, zwykle z innego miejsca na stosie, takich jak TCP, sumy kontrolne lub inne metody.
Przykłady
Oto przykład formularza RFC 4648 ( http://tools.ietf.org/html/rfc4648#section-8 )
Każdy znak wewnątrz funkcji „BASE64” zajmuje jeden bajt (base256). Następnie tłumaczymy to na base64.
BASE64("") = "" (No bytes used. 0%3=0.)
BASE64("f") = "Zg==" (One byte used. 1%3=1.)
BASE64("fo") = "Zm8=" (Two bytes. 2%3=2.)
BASE64("foo") = "Zm9v" (Three bytes. 3%3=0.)
BASE64("foob") = "Zm9vYg==" (Four bytes. 4%3=1.)
BASE64("fooba") = "Zm9vYmE=" (Five bytes. 5%3=2.)
BASE64("foobar") = "Zm9vYmFy" (Six bytes. 6%3=0.)
Oto koder, z którym możesz się pobawić: http://www.motobit.com/util/base64-decoder-encoder.asp