Uuencode
Az uuencoding a bináris adatok szöveggé alakításának egy formája, amely a Mary Ann Horton á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 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. A MIME segítségével az esetleg uuenkódolt fájlok Base64 kódolással kerülnek átvitelre.
Kódolt formátum
[szerkesztés | forrásszöveg szerkesztése]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 "`" (grave accent; 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:
- Kezdje 3 bájttal a forrásból, összesen 24 bittel.
- 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).
- 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), 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,[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.
- 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
[szerkesztés | forrásszöveg szerkesztése]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.
| bits | ASCII code | ASCII char |
bits | ASCII code | ASCII char |
bits | ASCII code | ASCII char |
bits | ASCII code | ASCII char | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00 | 96 | ` | 16 | 48 | 0 | 32 | 64 | @ | 48 | 80 | P | |||
| 01 | 33 | ! | 17 | 49 | 1 | 33 | 65 | A | 49 | 81 | Q | |||
| 02 | 34 | " | 18 | 50 | 2 | 34 | 66 | B | 50 | 82 | R | |||
| 03 | 35 | # | 19 | 51 | 3 | 35 | 67 | C | 51 | 83 | S | |||
| 04 | 36 | $ | 20 | 52 | 4 | 36 | 68 | D | 52 | 84 | T | |||
| 05 | 37 | % | 21 | 53 | 5 | 37 | 69 | E | 53 | 85 | U | |||
| 06 | 38 | & | 22 | 54 | 6 | 38 | 70 | F | 54 | 86 | V | |||
| 07 | 39 | ' | 23 | 55 | 7 | 39 | 71 | G | 55 | 87 | W | |||
| 08 | 40 | ( | 24 | 56 | 8 | 40 | 72 | H | 56 | 88 | X | |||
| 09 | 41 | ) | 25 | 57 | 9 | 41 | 73 | I | 57 | 89 | Y | |||
| 10 | 42 | * | 26 | 58 | : | 42 | 74 | J | 58 | 90 | Z | |||
| 11 | 43 | + | 27 | 59 | ; | 43 | 75 | K | 59 | 91 | [ | |||
| 12 | 44 | , | 28 | 60 | < | 44 | 76 | L | 60 | 92 | \ | |||
| 13 | 45 | - | 29 | 61 | = | 45 | 77 | M | 61 | 93 | ] | |||
| 14 | 46 | . | 30 | 62 | > | 46 | 78 | N | 62 | 94 | ^ | |||
| 15 | 47 | / | 31 | 63 | ? | 47 | 79 | O | 63 | 95 | _ |
Példa
[szerkesztés | forrásszöveg szerkesztése]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)
[szerkesztés | forrásszöveg szerkesztése]A Unix hagyományosan egyetlen elágazással 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 (HFS) egy adatelágazást és egy erőforráselágazást támogatott. A Mac OS HFS+ 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) ú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, 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
[szerkesztés | forrásszöveg szerkesztése]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. 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
[szerkesztés | forrásszöveg szerkesztése]Python
[szerkesztés | forrásszöveg szerkesztése]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
[szerkesztés | forrásszöveg szerkesztése]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]
Encode (oneliner)
[szerkesztés | forrásszöveg szerkesztése]$ 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]Jegyzetek
[szerkesztés | forrásszöveg szerkesztése]- ↑ Horton, Mark. "UUENCODE(1C) UNIX Programmer's Manual". The Unix Heritage Society (amerikai angol nyelven). Hozzáférés: 2020. november 10.
- ↑ "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.
- ↑ "PerlPowerTools source". metacpan.org (amerikai angol nyelven). Hozzáférés: 2024. február 12.
- ↑ "uuencode.pl source". main.linuxfocus.org (amerikai angol nyelven). Hozzáférés: 2024. február 12.
Fordítás
[szerkesztés | forrásszöveg szerkesztése]- 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
- 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