Uuencode i uudecode

Zakoduj tekst, bajty szesnastkowe lub pliki w klasycznym formacie Unix-to-Unix albo zdekoduj bloki uuencode ze starych e-maili, archiwów Usenetu i skryptów z powrotem do oryginalnych danych.

Działa w całości w przeglądarce. Nic nie jest wysyłane.

Jak używać

  1. Wybierz „Koduj”, aby utworzyć blok uuencode, lub „Dekoduj”, aby odzyskać z niego dane.
  2. Pozostaw włączoną opcję „Wiersze begin / end” i podaj nazwę w polu „Nazwa pliku”, jeśli wynik ma działać z poleceniem uudecode. Wyłącz tę opcję, aby otrzymać tylko wiersze danych.
  3. Wpisz lub wklej dane wejściowe albo otwórz plik, aby zakodować jego bajty.
  4. Przy dekodowaniu wklej cały blok, łącznie z wierszem begin, jeśli występuje, a następnie skopiuj wynik lub pobierz go jako plik.

Czym jest uuencode?

Uuencode (skrót od Unix-to-Unix encode) pochodzi z około 1980 roku, kiedy pliki kopiowano między komputerami z systemem Unix przez łącza UUCP, które przenosiły wyłącznie tekst. Zamienia każde 3 bajty na cztery wartości 6-bitowe i dodaje do każdej z nich 32, co daje drukowalne znaki od spacji do podkreślenia. Ponieważ systemy pocztowe często usuwały spacje na końcu wierszy, wartość zero zapisuje się jako grawis (`) zamiast spacji i tak też robi to narzędzie.

Plik uuencode ma stały układ:

  • Wiersz nagłówka begin 644 name, gdzie 644 to uniksowy tryb pliku zapisany ósemkowo (właściciel może czytać i zapisywać, pozostali tylko czytać), a name to nazwa tworzonego pliku.
  • Wiersze danych zawierające do 45 bajtów wejściowych. Każdy zaczyna się od znaku długości (32 plus liczba bajtów, więc pełny wiersz zaczyna się od M), po którym następuje do 60 zakodowanych znaków.
  • Wiersz z pojedynczym grawisem, oznaczający zero bajtów, a po nim wiersz end.

Wraz ze znakami długości i znakami końca wiersza wynik jest o ok. 38% większy od danych wejściowych.

Uuencode dzisiaj

Przed pojawieniem się MIME uuencode był typowym sposobem wysyłania programów i obrazów pocztą e-mail oraz publikowania ich w Usenecie. W latach 90. zastąpił go Base64 z MIME: uuencode nie pozwalał określić typu zawartości, istniało kilka niezgodnych wariantów, a niektóre jego znaki interpunkcyjne były zmieniane przez bramy między systemami ASCII i EBCDIC. Właśnie z tego powodu powstał xxencode.

Dane uuencode wciąż można spotkać w archiwach poczty i grup dyskusyjnych, starszych skryptach powłoki i dawnych systemach. W nowych projektach używaj Base64, a w przypadku całych plików narzędzia Plik na Base64.

Uuencode w wierszu poleceń i w Pythonie

# Powłoka (GNU sharutils): plik wejściowy, a potem nazwa dla wiersza begin
uuencode photo.jpg photo.jpg > photo.uu
uudecode photo.uu

# Python: jeden wiersz do 45 bajtów naraz
import binascii
line = binascii.b2a_uu(b'hello', backtick=True)
binascii.a2b_uu(line)          # b'hello'

Stary moduł uu został usunięty w Pythonie 3.13, ale funkcje z binascii pozostały.

Specyfikacja

AlfabetASCII od 32 do 96 (od spacji do `)
Rozmiar wynikuOk. 137% wraz z prefiksami wierszy
DopełnienieWiersze do 45 bajtów
StandardPOSIX uuencode
Rozróżnia wielkość literTak

Przykłady

Wejście (UTF-8)Wyjście
Hello, World!begin 644 data.bin -2&5L;&\L(%=O<FQD(0`` ` end
Base64.isbegin 644 data.bin )0F%S938T+FES ` end
你好begin 644 data.bin &Y+V@Y:6] ` end

Najczęściej zadawane pytania

Dlaczego tekst uuencode zawiera grawisy?

Wartość zero odpowiadałaby spacji, a spacje na końcu wierszy często ginęły podczas przesyłania. Wiele koderów, w tym ten, zapisuje zamiast niej grawis. Dekoder akceptuje oba znaki.

Co oznacza begin 644?

Rozpoczyna zakodowany blok. 644 to uniksowy tryb uprawnień odtworzonego pliku (odczyt i zapis dla właściciela, odczyt dla pozostałych), a słowo po nim to nazwa pliku, który utworzy uudecode. Nazwę można ustawić w polu „Nazwa pliku”.

Czy można zdekodować uuencode bez wiersza begin?

Tak. Jeśli nie ma wiersza begin, każdy wiersz jest dekodowany jako dane. Jeśli jest, dekodowanie zaczyna się po nim i kończy na wierszu end, więc tekst wokół bloku, np. treść e-maila, jest pomijany. Spacje końcowe usunięte przez programy pocztowe są przywracane automatycznie.

Czy uuencode to to samo co Base64?

Nie. Oba zamieniają 3 bajty na 4 znaki, ale uuencode używa innego zakresu znaków, znaku długości w każdym wierszu oraz wierszy begin i end. Wyniku Base64 nie da się zdekodować jako uuencode i odwrotnie.