Uuencode

Az uuencoding a bináris adatok szöveggé alakításának(wd) egy formája, amely a Mary Ann Horton(wd) által a kaliforniai Berkeley-i Egyetemen 1980-ban írt uuencode és uudecode Unix programokból ered, amelyek bináris adatokat kódolnak e-mail rendszerekben történő átvitelhez.

Az „uuencoding” név a Unix-to-Unix Copy(wd) kifejezésből származik, azaz az „Unix-to-Unix kódolás” egy biztonságos kódolás tetszőleges fájlok egyik Unix rendszerről egy másik Unix rendszerre történő átvitelére, de nincs garancia arra, hogy a közbenső linkek mind Unix rendszerek lennének. Mivel egy e-mail üzenet továbbítható különböző karakterkészletekkel rendelkező számítógépekre vagy számítógépeken keresztül, vagy olyan átviteli útvonalakon keresztül, amelyek nem 8 bitesek, vagy amelyeket nem 8 bitesek a programok kezelnek, egy bináris fájl e-mailben történő továbbítása a fájl sérülését okozhatja. Az ilyen adatoknak a legtöbb karakterkészletben közös karakterkészletbe kódolásával az ilyen adatfájlok kódolt formája valószínűleg nem „lefordításra” vagy sérülésre került, és így sértetlenül és változatlanul érkeztek meg a célállomásra. Az uudecode program megfordítja az uuencode hatását, pontosan újraalkotva az eredeti bináris fájlt. Az uuencode/decode népszerűvé vált bináris (és különösen tömörített) fájlok e-mailben történő küldésére és Usenet hírcsoportokba való közzétételére stb.

Mára nagyrészt felváltotta a MIME és az yEnc(wd). A MIME segítségével az esetleg uuenkódolt fájlok Base64 kódolással kerülnek átvitelre.

Kódolt formátum

Egy uuenkódolt fájl a következő fejléccel kezdődik:

begin <mode> <file><newline>

<mode> a fájl Unix fájlengedélyeit jelöli három oktális számjegyként (pl. 644, 744). Ennek jellemzően csak Unix-szerű operációs rendszereknél van jelentősége.

<file> a bináris adatok újra létrehozásakor használandó fájlnév.

<newline> egy új sor karaktert jelöl, amely minden sor lezárására szolgál.

Minden adatsor a következő formátumot használja:

<length character><formatted characters><newline>

<length character> egy olyan karakter, amely az adott sorban kódolt adatbájtok számát jelzi. Ez egy ASCII karakter, amelyet úgy határozunk meg, hogy a tényleges bájtszámhoz 32-t adunk hozzá, az egyetlen kivétel a súlyos ékezet(wd) "`" (grave accent(wd); ASCII kód 96), amely nulla bájtot jelent. Minden adatsor, kivéve az utolsót (ha az adathossz nem osztható 45-tel), 45 bájt kódolt adatot tartalmaz (60 karakter a kódolás után). Ezért a hosszértékek túlnyomó többsége 'M', (32 + 45 = ASCII kód 77 vagy "M").

<formatted characters> kódolt karakterek. A tényleges megvalósítással kapcsolatos további részletekért lásd a Formázási mechanizmus részt.

A fájl két sorral végződik:

`<newline>
end<newline>

Az utolsó előtti sor egy karakter is, amely a sor hosszát jelzi, ahol a záró ékezet nulla bájtot jelent.

Teljes fájlként a csak a Cat karaktereket tartalmazó cat.txt nevű egyszerű szövegfájl uuenkódolt kimenete a következő lenne:

begin 644 cat.txt
#0V%T
`
end

A kezdő sor egy szabványos uuencode fejléc; a '#' azt jelzi, hogy a sor három karaktert kódol; az utolsó két sor minden uuencoded fájl végén jelenik meg.

Formázási mechanizmus

Az uuenkódolás mechanizmusa minden 3 bájton a következőket ismétli, 4 nyomtatható karakterré kódolva azokat, ahol minden karakter egy radix-64 számjegyet jelöl:

  1. Kezdje 3 bájttal a forrásból, összesen 24 bittel.
  2. Ossza fel 4 6-bites csoportra, amelyek mindegyike egy 0 és 63 közötti értéket képvisel: bitek (00-05), (06-11), (12-17) és (18-23).
  3. Adjon hozzá 32-t mindegyik értékhez. A 32 hozzáadásával ez azt jelenti, hogy a lehetséges eredmények 32 (" " szóköz) és 95 ("_" aláhúzás) között lehetnek. A 96 ("`" súlyos ékezet(wd)), mint "különleges karakter", ennek a tartománynak a logikus kiterjesztése. Annak ellenére, hogy a szóköz karaktert a 0 érték kódolásaként dokumentálták, az olyan implementációk, mint a GNU sharutils(wd), valójában a súlyos ékezet karaktert használják a fájl törzsében lévő nullák kódolására is, soha nem használva szóközt.
  4. Adja ki ezeknek a számoknak az ASCII megfelelőjét.

Ha a forrás hossza nem osztható 3-mal, akkor az utolsó 4 bájtos szakasz kitöltő bájtokat tartalmaz, hogy tisztán osztható legyen. Ezeket a bájtokat kivonjuk a sor <length character> részéből, hogy a dekóder ne fűzzön hozzá nem kívánt karaktereket a fájlhoz.

A uudecoding a fentiek fordítottja: minden karakter ASCII kódjából kivonunk 32-t (modulo 64, hogy figyelembe vegyük a súlyos ékezet használatát), hogy 6 bites értéket kapjunk, 4 db 6 bites csoportot összefűzünk, hogy 24 bitet kapjunk, majd 3 bájtot adunk ki.

A kódolási folyamatot ez a táblázat mutatja be, amely a fenti kódolás levezetését mutatja a "Cat" esetében.

Eredeti karakterek C a t
Eredeti ASCII, decimális 67 97 116
ASCII, bináris 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0
Új decimális értékek 16 54 5 52
+32 48 86 37 84
uuenkódolt karakterek 0 V % T

uuencode tábla

A következő táblázat a konverziós folyamat során kapott 6 bites mezők decimális értékének konverzióját, valamint a hozzájuk tartozó ASCII karakter kimeneti kódot és karaktert mutatja.

Vegye figyelembe, hogy egyes kódolók szóközt (32-es kód) produkálhatnak ékezetes ("`", 96-os kód) helyett, míg egyes dekóderek elutasíthatják a szóközt tartalmazó adatok dekódolását.

bitsASCII
code
ASCII
char
bitsASCII
code
ASCII
char
bitsASCII
code
ASCII
char
bitsASCII
code
ASCII
char
0096`164803264@4880P
0133!174913365A4981Q
0234"185023466B5082R
0335#195133567C5183S
0436$205243668D5284T
0537%215353769E5385U
0638&225463870F5486V
0739'235573971G5587W
0840(245684072H5688X
0941)255794173I5789Y
1042*2658:4274J5890Z
1143+2759;4375K5991[
1244,2860<4476L6092\
1345-2961=4577M6193]
1446.3062>4678N6294^
1547/3163?4779O6395_

Példa

A következő egysoros szövegfájl uuenkódolásának példája. Ebben a példában a %0D a kocsivissza karakter bájtábrázolása, a %0A pedig a soremelés karakter bájtábrázolása.

file
File Name = wikipedia-url.txt
File Contents = http://www.wikipedia.org%0D%0A
uuencoding
begin 644 wikipedia-url.txt
::'1T<#HO+W=W=RYW:6MI<&5D:6$N;W)G#0H`
`
end

Forkok (fájl, erőforrás)

A Unix hagyományosan egyetlen elágazással(wd) tárolja a fájladatokat. Egyes fájlrendszerek azonban több, egyetlen fájlhoz kapcsolódó elágazást is támogatnak. Például a klasszikus Mac OS Hierarchical File System(wd) (HFS) egy adatelágazást és egy erőforráselágazást(wd) támogatott. A Mac OS HFS+(wd) több elágazást támogat, akárcsak a Microsoft Windows NTFS alternatív adatfolyamai. A legtöbb uukódoló eszköz csak az elsődleges adatelágazásból származó adatokat kezeli, ami információvesztéshez vezethet kódolás/dekódolás során (például a Windows NTFS fájlmegjegyzései egy másik elágazásban tárolódnak). Néhány eszköz (mint például a klasszikus Mac OS alkalmazás, az UUTool(wd)) úgy oldotta meg a problémát, hogy a különböző elágazásokat egy fájlba fűzte össze, és fájlnév szerint különböztette meg őket.

Kapcsolat az xxencode, Base64 és ASCII85 kódolásokkal

Korlátozott karaktertartománya ellenére az uuenkódolt adatok időnként megsérülhetnek bizonyos, nem ASCII karakterkészleteket, például az EBCDIC-t használó számítógépeken történő áthaladás során. A probléma megoldására tett egyik kísérlet az xxencode formátum volt, amely csak alfanumerikus karaktereket, valamint plusz és mínusz szimbólumokat használt. Manapság elterjedtebb a Base64 formátum, amely ugyanazon a csak alfanumerikus koncepción alapul, szemben az ASCII 32–95-tel. Mindhárom formátum 6 bitet (64 különböző karaktert) használ a bemeneti adatok ábrázolására.

A Base64 kódot az uuencode programmal is lehet generálni, és formátuma hasonló, kivéve a tényleges karakterfordítást:

A fejléc erre változik:

begin-base64 <mode> <file>

a vége ez lesz

====

és a köztes sorok a következőből kiválasztott karakterekkel vannak kódolva:

ABCDEFGHIJKLMNOP
QRSTUVWXYZabcdef
ghijklmnopqrstuv
wxyz0123456789+/

Egy másik alternatíva az Ascii85(wd), amely négy bináris karaktert kódol öt ASCII karakterként. Az ASCII85-öt PostScript és PDF formátumokban használják.

Hátrányok

Az uuencoding 3 előre formázott bájtból 4-et csinál, és hozzáadja a kezdő/záró címkéket, a fájlnevet és az elválasztójeleket(wd). Ez legalább 33%-kal több adatot termel a forrásfájlhoz képest, bár ezt legalább valamelyest kompenzálni lehet a fájl tömörítésével az uuencoding előtt.

Nyelvtámogatás

Python

A Python nyelv támogatja az uuenkódolást a "uu" kodekkel ellátott kodek modul használatával:

Python 2 esetén (elavult/megszűnt 2020. január 1-jétől):

$ python -c 'print "Cat".encode("uu")'
begin 666 <data>
#0V%T

end

$

Python 3 esetén ahol a kodek modult importálni és közvetlenül használni kell:

$ python3 -c "from codecs import encode;print(encode(b'Cat', 'uu'))"
b'begin 666 <data>\n#0V%T\n \nend\n'
$

Dekódoláshoz add át a teljes fájlt:

$ python3 -c "from codecs import decode;print(decode(b'begin 666 <data>\n#0V%T\n \nend\n', 'uu'))"
b'Cat'

Perl

A Perl nyelv natívan támogatja az uuenkódolást a pack() és unpack() operátorok használatával, az "u" formátumú karakterlánccal:

$ perl -e 'print pack("u","Cat")'
#0V%T

A base64 dekódolása az unpack paranccsal hasonlóképpen elvégezhető a karakterek lefordításával:

$ perl -e 'print unpack("u","#0V%T")'
Cat

Jól formázott uuenkódolt fájlok létrehozásához modulokat kell használni, vagy egy kicsit több kódot:

Encode (oneliner)

$ perl -ple  'BEGIN{use File::Basename;$/=undef;$sn=basename($ARGV[0]);} $_= "begin 600 $sn\n".(pack "u", $_)."`\nend" if $_' /some/file/to_encode.gz

PHP

A PHP nyelv rendelkezik egy natív convert_uuencode() függvénnyel:

$ php -r "echo convert_uuencode('Cat');"
#0V%T
`

A dekódolás a megfelelő convert_uudecode() függvénnyel történik:

$ php -r "echo convert_uudecode('#0V%T');"
Cat

Kapcsolódó szócikkek

Jegyzetek

  1. ↑ Horton, Mark. "UUENCODE(1C) UNIX Programmer's Manual". The Unix Heritage Society (amerikai angol nyelven). Hozzáférés: 2020. november 10.
  2. ↑ "uuencode.c source". fossies.org (amerikai angol nyelven). 2021. június 5. dátummal az eredeti címről archiválva. Hozzáférés: 2021. június 5.
  3. ↑ "PerlPowerTools source". metacpan.org (amerikai angol nyelven). Hozzáférés: 2024. február 12.
  4. ↑ "uuencode.pl source". main.linuxfocus.org (amerikai angol nyelven). Hozzáférés: 2024. február 12.

Fordítás

További információk