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 :

  1. Zacznij od 3 bajtów ze źródła, łącznie 24 bity .
  2. 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).
  3. 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.
  4. 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ż

Linki zewnętrzne