uuencoding
uuencoding to forma kodowania binarnego na tekst , która wywodzi się z programów uniksowych uuencode i uudecode napisanych przez Mary Ann Horton z Uniwersytetu Kalifornijskiego w Berkeley w 1980 r. do kodowania danych binarnych do transmisji w systemach poczty elektronicznej .
Nazwa „uuencoding” pochodzi od Unix-to-Unix Copy , tj. „Unix-to-Unix encoding” jest bezpiecznym kodowaniem służącym do przesyłania dowolnych plików z jednego systemu Unix do innego, ale bez gwarancji, że interweniujące łącza wszystkie będą systemami Unix. Ponieważ wiadomość e-mail może być przekazywana przez lub do komputerów z różnymi zestawami znaków lub przez transporty, które nie są czyste 8-bitowo lub obsługiwane przez programy, które nie są 8-bitowe, przesłanie pliku binarnego pocztą e-mail może spowodować jego uszkodzenie. Dzięki kodowaniu takich danych do podzbioru znaków wspólnego dla większości zestawów znaków, zakodowana forma takich plików danych była mało prawdopodobna do „przetłumaczenia” lub uszkodzenia, a zatem dotarłaby w stanie nienaruszonym i niezmienionym do miejsca docelowego. Program uudecode odwraca efekt uuencode , odtwarzając dokładnie oryginalny plik binarny. uuencode/decode stało się popularne do wysyłania plików binarnych (a zwłaszcza skompresowanych) pocztą e-mail i publikowania na Usenet itp.
Obecnie został w dużej mierze zastąpiony przez MIME i yEnc . W przypadku MIME pliki, które mogły zostać zakodowane, są zamiast tego przesyłane z kodowaniem base64 .
Zakodowany format
Uuencoded plik zaczyna się od linii nagłówka w postaci:
zaczynać<mode><file><newline>
<tryb>
to uprawnienia do pliku Unix jako trzy cyfry ósemkowe (np. 644, 744). Jest to zazwyczaj istotne tylko w typu unix .
<plik>
to nazwa pliku, która ma być używana podczas odtwarzania danych binarnych.
<newline>
oznacza znak nowej linii , używany do zakończenia każdej linii.
Każda linia danych używa formatu:
<length character><formatted characters><newline>
<znak długości>
to znak wskazujący liczbę bajtów danych, które zostały zakodowane w tej linii. Jest to ASCII określony przez dodanie 32 do rzeczywistej liczby bajtów, z jedynym wyjątkiem poważnego akcentu „`” (kod ASCII 96) oznaczającego zero bajtów. Wszystkie linie danych oprócz ostatniej (jeśli długość danych nie była podzielna przez 45) mają 45 bajtów zakodowanych danych (60 znaków po zakodowaniu). Dlatego zdecydowana większość wartości długości to „M”, (32 + 45 = kod ASCII 77 lub „M”).
<sformatowane znaki>
to zakodowane znaki. Zobacz Mechanizm formatowania, aby uzyskać więcej informacji na temat rzeczywistej implementacji.
Plik kończy się dwiema liniami:
` koniec
Linia przedostatnia jest również znakiem wskazującym długość linii z akcentem grobowym oznaczającym zero bajtów.
Jako kompletny plik, wyjście zakodowane uuen dla zwykłego pliku tekstowego o nazwie cat.txt zawierającego tylko znaki Cat byłyby
początek 644 cat.txt #0V%T ` koniec
Linia początku to standardowy nagłówek uuencode; znak „#” wskazuje, że jego linia zawiera trzy znaki; ostatnie dwa wiersze pojawiają się na końcu wszystkich plików uuencoded.
Mechanizm formatowania
Mechanizm uuencoding
powtarza następujące czynności dla każdych 3 bajtów, kodując je w 4 drukowalne znaki, z których każdy reprezentuje cyfrę radix-64 :
- Zacznij od 3 bajtów ze źródła, łącznie 24 bity .
- Podzielone na 4 6- bitowe grupy, z których każda reprezentuje wartość z zakresu od 0 do 63: bity (00-05), (06-11), (12-17) i (18-23).
- Dodaj 32 do każdej z wartości. Po dodaniu 32 oznacza to, że możliwe wyniki mogą zawierać się w przedziale od 32 (spacja " ") do 95 ( podkreślenie "_" ). 96 („`” akcent poważny ) jako „znak specjalny” jest logicznym rozszerzeniem tego zakresu. Pomimo udokumentowania znaku spacji jako kodowania wartości 0, implementacje, takie jak GNU sharutils, w rzeczywistości używają znaku akcentu poważnego również do kodowania zer w treści pliku, nigdy nie używając spacji.
- Wypisz odpowiednik ASCII tych liczb.
Jeśli długość źródła nie jest podzielna przez 3, to ostatnia 4-bajtowa sekcja będzie zawierała bajty dopełniające , aby była podzielna. Bajty te są odejmowane od <znaku długości>
linii, dzięki czemu dekoder nie dołącza niechcianych znaków do pliku.
uudecoding
jest odwrotnością powyższego, odejmij 32 od kodu ASCII każdego znaku ( moduł 64, aby uwzględnić użycie poważnego akcentu ), aby uzyskać wartość 6-bitową, połącz 4 6-bitowe grupy, aby uzyskać 24 bity, a następnie wyprowadź 3 bajty.
Proces kodowania jest przedstawiony w tej tabeli, która pokazuje pochodzenie powyższego kodowania dla „Cat”.
Oryginalne postacie |
C
|
A
|
T
|
|||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Oryginalny ASCII, dziesiętny | 67 | 97 | 116 | |||||||||||||||||||||
ASCII, binarny | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
Nowe wartości dziesiętne | 16 | 54 | 5 | 52 | ||||||||||||||||||||
+32 | 48 | 86 | 37 | 84 | ||||||||||||||||||||
Uuencoded znaków |
0
|
V
|
%
|
T
|
tabela uuencode
Poniższa tabela przedstawia konwersję wartości dziesiętnej pól 6-bitowych uzyskanych podczas procesu konwersji oraz odpowiadającego im kodu wyjściowego i znaku ASCII .
Należy zauważyć, że niektóre kodery mogą generować spację (kod 32) zamiast poważnego akcentu („`”, kod 96), podczas gdy niektóre dekodery mogą odmawiać dekodowania danych zawierających spację.
sześć bitów |
kod ASCII |
Znak ASCII |
sześć bitów |
kod ASCII |
Znak ASCII |
sześć bitów |
kod ASCII |
Znak ASCII |
sześć bitów |
kod ASCII |
Znak ASCII |
sześć bitów |
kod ASCII |
Znak ASCII |
sześć bitów |
kod ASCII |
Znak ASCII |
sześć bitów |
kod ASCII |
Znak ASCII |
||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | 96 | ` | 10 | 42 | * | 20 | 52 | 4 | 30 | 62 | > | 40 | 72 | H | 50 | 82 | R | 60 | 92 | \ | ||||||
01 | 33 | ! | 11 | 43 | + | 21 | 53 | 5 | 31 | 63 | ? | 41 | 73 | I | 51 | 83 | S | 61 | 93 | ] | ||||||
02 | 34 | " | 12 | 44 | , | 22 | 54 | 6 | 32 | 64 | @ | 42 | 74 | J | 52 | 84 | T | 62 | 94 | ^ | ||||||
03 | 35 | # | 13 | 45 | - | 23 | 55 | 7 | 33 | 65 | A | 43 | 75 | k | 53 | 85 | u | 63 | 95 | _ | ||||||
04 | 36 | $ | 14 | 46 | . | 24 | 56 | 8 | 34 | 66 | B | 44 | 76 | Ł | 54 | 86 | V | |||||||||
05 | 37 | % | 15 | 47 | / | 25 | 57 | 9 | 35 | 67 | C | 45 | 77 | M | 55 | 87 | W | |||||||||
06 | 38 | & | 16 | 48 | 0 | 26 | 58 | : | 36 | 68 | D | 46 | 78 | N | 56 | 88 | X | |||||||||
07 | 39 | ' | 17 | 49 | 1 | 27 | 59 | ; | 37 | 69 | mi | 47 | 79 | O | 57 | 89 | Y | |||||||||
08 | 40 | ( | 18 | 50 | 2 | 28 | 60 | < | 38 | 70 | F | 48 | 80 | P | 58 | 90 | Z | |||||||||
09 | 41 | ) | 19 | 51 | 3 | 29 | 61 | = | 39 | 71 | G | 49 | 81 | Q | 59 | 91 | [ |
Przykład
Poniżej znajduje się przykład uuencodowania jednowierszowego pliku tekstowego. W tym przykładzie %0D to bajtowa reprezentacja powrotu karetki (CR), a %0A to bajtowa reprezentacja nowego wiersza (LF).
- plik
Nazwa pliku = wikipedia-url.txt Zawartość pliku = http://www.wikipedia.org%0D%0A
- uuencoding
begin 644 wikipedia-url.txt ::'1T<#HO+W=W=RYW:6MI<&5D :6$N;W)G#0H` ` koniec
Widelce (plik, zasób)
Unix tradycyjnie ma jeden rozwidlenie , w którym przechowywane są dane pliku. Jednak niektóre systemy plików obsługują wiele rozwidleń powiązanych z jednym plikiem. Na przykład klasyczny Mac OS HFS obsługiwał fork danych i fork zasobów . Mac OS HFS+ obsługuje wiele rozwidleń, podobnie jak alternatywne strumienie danych Microsoft Windows NTFS . Większość narzędzi uucoding obsługuje tylko dane z głównego rozwidlenia danych, co może spowodować utratę informacji podczas kodowania/dekodowania (na przykład komentarze do plików systemu Windows NTFS są przechowywane w innym rozwidleniu). Niektóre narzędzia (takie jak klasyczna aplikacja Mac OS UUTool ) rozwiązał problem, łącząc różne rozwidlenia w jeden plik i rozróżniając je według nazwy pliku.
Związek z xxencode, Base64 i Ascii85
Pomimo ograniczonego zakresu znaków, zakodowane dane są czasami uszkadzane podczas przechodzenia przez niektóre komputery przy użyciu zestawów znaków innych niż ASCII, takich jak EBCDIC . Jedną z prób rozwiązania problemu był format xxencode, który używał tylko znaków alfanumerycznych oraz symboli plusa i minusa. Bardziej powszechny jest dzisiaj format Base64, który opiera się na tej samej koncepcji alfanumerycznej , w przeciwieństwie do ASCII 32–95. Wszystkie trzy formaty używają 6 bitów (64 różnych znaków) do reprezentowania swoich danych wejściowych.
Base64 może być również generowany przez program uuencode i ma podobny format, z wyjątkiem rzeczywistej translacji znaków:
Nagłówek jest zmieniony na
podstawa-rozpocznij64<mode><file>
przyczepa staje się
====
a linie pomiędzy nimi są kodowane za pomocą wybranych znaków
ABCDEFGHIJKLMNOP QRSTUVWXYZabcdef ghijklmnopqrstuv wxyz0123456789+/
Inną alternatywą jest Ascii85 , który koduje cztery znaki binarne w pięciu znakach ASCII. Ascii85 jest używany w PostScript i PDF .
Niedogodności
uuencoding pobiera 3 wstępnie sformatowane bajty i zamienia je na 4, a także dodaje znaczniki początku/końca, nazwę pliku i ograniczniki . Dodaje to co najmniej 33% narzutu danych w porównaniu z samym źródłem, chociaż można to przynajmniej w pewnym stopniu zrekompensować, kompresując plik przed jego kodowaniem.
Wsparcie w językach
Pyton
Język Python obsługuje uuencoding przy użyciu modułu codecs z kodekiem „uu”:
Dla Pythona 2 (przestarzałe/wygasłe od 1 stycznia 2020 r.) :
$ python -c 'print "Cat".encode("uu")' begin 666 <dane> # 0V%T end $
W przypadku Pythona 3 , w którym moduł kodeków musi zostać zaimportowany i użyty bezpośrednio :
$ python3 -c "z kodeków import encode;print(encode(b'Cat', 'uu'))" b'begin 666 <dane>\n#0V%T\n \nend\n'
$
Perl
Język Perl obsługuje uuencoding natywnie przy użyciu operatorów pack() i unpack() z ciągiem formatującym „u”:
$ perl -e 'print pack("u","Kot")' # 0V%T
Dekodowanie base64 za pomocą unpack można również wykonać poprzez przetłumaczenie znaków:
$ perl -e ' $a = "Q2F0" ; $a = ~tr#A-Za-z0-9+/ \.\_ ##cd; # usuń znaki inne niż base64 > $a=~tr#A-Za-z0-9+/# -_#; # przetłumacz zestawy > print unpack("u",pack("C",32+int(length($1)*6 / 8)) .$1) while($a=~s/(.{60}|.+ )//);' Kot
Zobacz też
- Kodowanie binarne na tekst w celu porównania różnych algorytmów kodowania
Linki zewnętrzne
- uuencode w POSIX.1-2008, http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uuencode.html
- GNU-sharutils – pakiet open source narzędzi shar/unshar/uuencode/uudecode
- UUDeview – program typu open source do kodowania/dekodowania Base64, BinHex, uuencode, xxencode itp. dla systemów Unix/Windows/DOS
- UUENCODE-UUDECODE - program open source do kodowania / dekodowania stworzony przez Clema „Grandad” Dye
- StUU - szybki UUDecoder Open Source dla komputerów Macintosh autorstwa Stuarta Cheshire
- UUENCODE-UUDECODE – Darmowy internetowy UUEncoder i UUDecoder
- Java UUDecoder — biblioteka Open Source Java do dekodowania załączników (poczty) w formacie uuencoded
- AN11229 – Nota aplikacyjna NXP: UUencoding for UART ISP