close
Ugrás a tartalomhoz

Uuencode

Ellenőrzött
A Wikipédiából, a szabad enciklopédiából

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,[1] 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 uuecode 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.

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

[szerkesztés | forrásszöveg szerkesztése]

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),[2] 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

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_

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

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

[szerkesztés | forrásszöveg szerkesztése]

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.

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.

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'

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,[3] vagy egy kicsit több kódot:[4]

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

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

[szerkesztés | forrásszöveg szerkesztése]
  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.
  • Ez a szócikk részben vagy egészben az uuencoding című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

További információk

[szerkesztés | forrásszöveg szerkesztése]
  • uuencode entry in POSIX.1-2008
  • GNU-sharutils – nyílt forráskódú shar/unshar/uuencode/uudecode segédprogramcsomag
  • UUDeview – nyílt forráskódú program Base64, BinHex, uuencode, xxencode stb. kódolására/dekódolására Unix/Windows/DOS rendszerekhez
  • StUU – nyílt forráskódú gyors UUDecoder Macintosh-ra, készítette: Stuart Cheshire(wd)
  • nyílt forráskódú Java könyvtár uuenkódolt (e-mail) mellékletek dekódolásához
  • AN11229 – NXP alkalmazási megjegyzés: UU kódolás UART ISP-hez