UUencode
Uuencode/UUencode er en computeralgoritme der benyttes til dataenkapsulering ved at konvertere et sæt datas tegnsæt til et andet tegnsæt med det formål at undgå tegn, der kan virke forstyrrende i nogle protokoller og formater.
Historie
Uuencode blev oprindeligt brugt i Unix-styresystemet til transmission af data over UUCP-postsystemet. Uuencode har derfor sit navn fra "Unix-til-Unix encode". Uuencode er senere hen blevet populært i andre postsystemer og på Usenet selvom det i stort omfang er erstattet af Base64 og senere MIME. Uuencode understøttes af de fleste E-mail-programmer.
Problemet i en nøddeskal
- Dette afsnit beskriver dataenkapsulering.
Netværk og Internet består i dag af mange lag (se OSI-modellen) fra de fysiske ledninger og netværksudstyr frem til de protokoller som bliver håndteret af computerbrugerens programmer. Foruden de lag understøtter mange protokoller at man sender flere slags data, for eksempel vedhæftede filer i e-mails eller videosamtaler over chat hvor tekst tidligere har været den primære kommunikationsform. I protokoller og filformater hvor indre protokoller og/eller filformater forekommer, opstår et problem idet noget af det data i det indre format kan forstyrre dataet i det ydre format. Det skyldes at datasekvenser der har en speciel betydning i det indre data (for eksempel farven på et vedhæftet billede) kan have en betydning i det ydre data (for eksempel e-mailen), der, hvis der opstår en forvirring i form af eksempelvis tvetydighed i fortolkningen af dataet, kan korruptere den endelige besked.
Uuencode kan i et sådan tilfælde benyttes til at omformulere det indre data sådan at det umuligt kan indeholde datasekvenser der kan kollidere med ydre protokoller eller formater. Dette opnås ved først at finde et subset af det benyttede tegnsæt (ASCII[1]) der ikke volder problemer – Uuencode benytter altid symbolerne i ASCII-tabellen mellem 32 og 96 fordi de alle sammen kan udskrives og findes i andre tegnsæt som ISO 8859 og UTF-8.
En anden løsning til ovenstående problem er escape-sekvenser, ofte brugt i programmering. En tredje løsning er at benytte protokoller som bruger datablokke af ens længder, sådan at man altid ved hvorvidt data skal fortolkes som det indeholdende format eller som det indeholdte.
Algoritmen beskrevet
Uuencode kan beskrives ved følgende pseudokode:
Begynd Læs 3 bytes. Hvis der er færre, Fyld de sidste bits, op til tre bytes, med 0'er. Del disse 24 bits (3 bytes) i 4 grupper med 6 bits i hver. Betragt disse 4 grupper som henholdsvis 4 tal fra 0-63. Læg 32 (decimal) til hvert af disse tal. Udskriv ASCII-tegnet for hvert af disse tal. Gentag indtil der ikke er mere data.
Denne algoritme bryder dataet op så sæt af tre bytes bliver fordelt over fire bytes. Dette gør algoritmen ekspansiv og derfor modsat en komprimeringsalgoritme. Det betyder effektivt at data som er uuencoded fylder over 33% mere. Grunden til at 32 bliver lagt til hvert tal, er fordi det i ASCII-tabellen svarer til tegnet for mellemrum (" "), hvilket betyder at hver af de fire nye bytes, der bliver skrevet, ligger i rækken 32 til (32+63=95), hvor tegn 95 er understreg ("_"). ASCII-tegn over 95 må også godt bruges, men kun de seks bits mest til højre vil blive betragtet.
Efterfølgende består uuencode-formatet af grupper a 60 tegn (svarende til 45 input-bytes) der er adskilt med linjeskift og starter med et tegn der fortæller hvor meget data der er på linjen. Dette tegn er ofte 'M', da dette tegn svarer til ASCII-kode 77, som er lig med 32 + 45, hvor 45 er antallet af oprindelige bytes. Det plejer dog at være forskelligt på sidste linje, da mængden af bytes i det meste data ikke går op i 45.
Nogle gange indeholder uuencode desuden accent grave-tegnet for at undgå et problem med nogle e-mail-programmer der fjerner tomme linjer i slutningen af en tekst. Accent grave, blandt andre, bliver ignoreret af Uuencode, da den ikke ligger inden for det gyldige tegnsæt. Accent grave (ASCII 96) kan desuden bruges som mellemrumstegn, da dens seks bits mest til højre svarer til det samme som tegnet for mellemrums seks bits mest til højre, 100000.
dec | tegn | dec | tegn | dec | tegn | dec | tegn | dec | tegn | dec | tegn | dec | tegn | dec | tegn |
32 | 40 | ( | 48 | 0 | 56 | 8 | 64 | @ | 72 | H | 80 | P | 88 | X | |
33 | ! | 41 | ) | 49 | 1 | 57 | 9 | 65 | A | 73 | I | 81 | Q | 89 | Y |
34 | " | 42 | * | 50 | 2 | 58 | : | 66 | B | 74 | J | 82 | R | 90 | Z |
35 | # | 43 | + | 51 | 3 | 59 | ; | 67 | C | 75 | K | 83 | S | 91 | [ |
36 | $ | 44 | , | 52 | 4 | 60 | < | 68 | D | 76 | L | 84 | T | 92 | \ |
37 | % | 45 | - | 53 | 5 | 61 | = | 69 | E | 77 | M | 85 | U | 93 | ] |
38 | & | 46 | . | 54 | 6 | 62 | > | 70 | F | 78 | N | 86 | V | 94 | ^ |
39 | ' | 47 | / | 55 | 7 | 63 | ? | 71 | G | 79 | O | 87 | W | 95 | _ |
40 | ( | 48 | 0 | 56 | 8 | 64 | @ | 72 | H | 80 | P | 88 | X | 96 | ` |
41 | ) | 49 | 1 | 57 | 9 | 65 | A | 73 | I | 81 | Q | 89 | Y | ||
42 | * | 50 | 2 | 58 | : | 66 | B | 74 | J | 82 | R | 90 | Z | ||
43 | + | 51 | 3 | 59 | ; | 67 | C | 75 | K | 83 | S | 91 | [ |
Eksempel på uuencoded tekst
Disse 45 tegn:
Dette er et eksempel på en uuencoded tekst..
Oversættes til disse 61 tegn (60 tegn plus det første tegn der indeholder længden af den efterfølgende streng):
M1&5T=&4@97(@970@96MS96UP96P@<.4@96X@=75E;F-O9&5D('1E:W-T+BX*
Anvendelse
Uuencode løste mange problemer, men der forekommer stadig nogle problemer med ældre computere som fx EBCDIC der ikke benytter ASCII-tegnsættet. Xxencode er en mere robust løsning på dette problem, da den kun benytter alfanumeriske tegn samt plus og minus.
Referencer
- ^ Uuencode benytter altid, men algoritmer tilsvarende Uuencode kan opstilles til at benytte andre tegnsæt som set ved Base 64.