codificare uu - uuencoding

uuencoding este o formă de codificare binar-text care a apărut în programele Unix uuencode și uudecode scrise de Mary Ann Horton la UC Berkeley în 1980, pentru codificarea datelor binare pentru transmiterea în sisteme de e-mail.

Numele „uuencoding” este derivat din „Unix-to-Unix encoding”, adică ideea utilizării unei codificări sigure pentru a transfera fișiere Unix dintr-un sistem Unix în alt sistem Unix, dar fără a garanta că legăturile care intervin ar fi toate sisteme Unix. Deoarece un mesaj de e-mail ar putea fi redirecționat prin sau către computere cu seturi de caractere diferite sau prin transporturi care nu sunt curate pe 8 biți sau gestionate de programe care nu sunt curate pe 8 biți, redirecționarea unui fișier binar prin e-mail ar putea duce la corupția acestuia . Codificând astfel de date într-un subset de caractere comun majorității seturilor de caractere, este puțin probabil ca forma codificată a acestor fișiere de date să fie „tradusă” sau coruptă și astfel ar ajunge intactă și neschimbată la destinație. Programul uudecode inversează efectul uuencode , recreând exact fișierul binar original. uuencode / decode a devenit popular pentru trimiterea de fișiere binare (și mai ales comprimate) prin e-mail și postarea în grupurile de știri Usenet etc.

Acum a fost în mare parte înlocuit de MIME și yEnc . Cu MIME, fișierele care ar fi putut fi codificate uuenc sunt transferate cu codificare base64 .

Format codat

Un fișier codat inițial începe cu o linie de antet a formularului:

begin <mode> <file><newline>

<mode> este permisiunea de fișier Unix a fișierului ca trei cifre octale (de exemplu, 644, 744). Acest lucru este de obicei semnificativ doar pentru sistemele de operare asemănătoare unix .

<file> este numele fișierului care trebuie utilizat la recrearea datelor binare.

<newline> semnifică un caracter newline , folosit pentru a termina fiecare linie.

Fiecare linie de date folosește formatul:

<length character><formatted characters><newline>

<caracter lungime> este un caracter care indică numărul de octeți de date care au fost codați pe acea linie. Acesta este un caracter ASCII determinat prin adăugarea 32 la numărul real de octeți, cu singura excepție a accentului grav "" "(cod ASCII 96) care semnifică zero octeți. Toate liniile de date, cu excepția ultimei (dacă lungimea datelor nu a fost divizibilă cu 45), au 45 de octeți de date codificate (60 de caractere după codificare). Prin urmare, marea majoritate a valorilor lungimii este „M”, (32 + 45 = cod ASCII 77 sau „M”).

<caractere formatate> sunt caractere codate. Consultați Mecanismul de formatare pentru mai multe detalii despre implementarea efectivă.

Fișierul se încheie cu două linii:

`<newline>
end<newline>

A doua până la ultima linie este, de asemenea, un caracter care indică lungimea liniei cu accentul grav care semnifică zero octeți.

Ca fișier complet, ieșirea codificată uuenc pentru un fișier text simplu numit cat.txt care conține doar caracterele Cat ar fi

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

Linia de început este un antet standard de cod uuenc; „#” indică faptul că linia sa codifică trei caractere; ultimele două rânduri apar la sfârșitul tuturor fișierelor codificate uuenc.

Mecanism de formatare

Mecanismul codificării uu repetă următoarele pentru fiecare 3 octeți, codificându-le în 4 caractere imprimabile, fiecare caracter reprezentând o cifră numerică radix-64 :

  1. Începeți cu 3 octeți de la sursă, 24 de biți în total.
  2. Împărțiți în 4 grupări de 6 biți , fiecare reprezentând o valoare cuprinsă între 0 și 63: biți (00-05), (06-11), (12-17) și (18-23).
  3. Adăugați 32 la fiecare dintre valori. Prin adăugarea a 32, acest lucru înseamnă că rezultatele posibile pot fi între 32 ("" spațiu) și 95 ("_" subliniat ). 96 ("" " accent grav ) ca" caracter special "este o extensie logică a acestui interval. Deși caracterul spațial este documentat ca codificare pentru valoarea 0, implementările, cum ar fi GNU sharutils, folosesc de fapt caracterul accent grav pentru a codifica zerouri și în corpul fișierului, fără a utiliza niciodată spațiul.
  4. Afișați echivalentul ASCII al acestor numere.

Dacă lungimea sursei nu este divizibilă cu 3, atunci ultima secțiune de 4 octeți va conține octeți de umplere pentru a o face divizibilă. Acești octeți sunt scăși din <caracterul lungimii> al liniei, astfel încât decodificatorul să nu adauge caractere nedorite la fișier.

codificarea uud este inversă cu cea de mai sus, scădeți 32 din codul ASCII al fiecărui caracter ( modulul 64 pentru a ține cont de utilizarea accentului grav ) pentru a obține o valoare de 6 biți, concatenați 4 grupuri de 6 biți pentru a obține 24 de biți, apoi scoateți 3 octeți.

Procesul de codificare este demonstrat de acest tabel, care arată derivarea codificării de mai sus pentru „Cat”.

Personaje originale C a t
ASCII original, zecimal 67 97 116
ASCII, binar 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0
Noi valori zecimale 16 54 5 52
+32 48 86 37 84
Personaje codificate uu 0 V % T

tabel uuencode

Tabelul următor arată conversia valorii zecimale a câmpurilor de 6 biți obținute în timpul procesului de conversie și codul și caracterul de ieșire al caracterelor ASCII corespunzătoare .

Rețineți că unele codificatoare ar putea produce spațiu (cod 32) în loc de accent grav („` ”, cod 96), în timp ce unii decodificatori ar putea refuza decodarea datelor care conțin spațiu.

șase
biți

Cod ASCII
ASCII
char
șase
biți

Cod ASCII
ASCII
char
șase
biți

Cod ASCII
ASCII
char
șase
biți

Cod ASCII
ASCII
char
șase
biți

Cod ASCII
ASCII
char
șase
biți

Cod ASCII
ASCII
char
șase
biți

Cod ASCII
ASCII
char
00 96 `   10 42 *   20 52 4   30 62 >   40 72 H   50 82 R   60 92 \
01 33 !   11 43 +   21 53 5   31 63 ?   41 73 Eu   51 83 S   61 93 ]
02 34 "   12 44 ,   22 54 6   32 64 @   42 74 J   52 84 T   62 94 ^
03 35 #   13 45 -   23 55 7   33 65 A   43 75 K   53 85 U   63 95 _
04 36 $   14 46 .   24 56 8   34 66 B   44 76 L   54 86 V
05 37 %   15 47 /   25 57 9   35 67 C   45 77 M   55 87 W
06 38 &   16 48 0   26 58 :   36 68 D   46 78 N   56 88 X
07 39 '   17 49 1   27 59 ;   37 69 E   47 79 O   57 89 Da
08 40 (   18 50 2   28 60 <   38 70 F   48 80 P   58 90 Z
09 41 )   19 51 3   29 61 =   39 71 G   49 81 Î   59 91 [

Exemplu

Următorul este un exemplu de codare uu a unui fișier text pe o linie. În acest exemplu, % 0D este reprezentarea de octeți pentru returnarea transportului (CR) și % 0A este reprezentarea de octet pentru avansul de linie (LF).

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

Furci (fișier, resursă)

Unix are în mod tradițional o singură furcă în care sunt stocate datele de fișiere. Cu toate acestea, unele sisteme de fișiere acceptă mai multe furci asociate cu un singur fișier. De exemplu, clasicul Mac OS HFS a acceptat un fork de date și un fork de resurse . Mac OS HFS + acceptă mai multe furci, la fel ca Microsoft Windows NTFS fluxuri de date alternative . Majoritatea instrumentelor de uucodare vor gestiona doar datele din furculița primară de date, ceea ce poate duce la pierderea informațiilor la codificare / decodare (de exemplu, comentariile fișierului Windows NTFS sunt păstrate într-o altă furcă). Unele instrumente (cum ar fi aplicația clasică Mac OS UUTool ) au rezolvat problema prin concatenarea diferitelor furci într-un singur fișier și diferențierea acestora după numele fișierului.

Relație cu xxencode, Base64 și Ascii85

În ciuda gamei limitate de caractere, datele codificate uu sunt uneori corupte la trecerea prin anumite computere folosind seturi de caractere non-ASCII, cum ar fi EBCDIC . O încercare de a rezolva problema a fost formatul xxencode, care folosea doar caractere alfanumerice și simbolurile plus și minus. Mai frecvent astăzi este formatul Base64, care se bazează pe același concept de alfanumeric- doar spre deosebire de ASCII 32-95. Toate cele trei formate utilizează 6 biți (64 de caractere diferite) pentru a-și reprezenta datele de intrare.

Base64 poate fi, de asemenea, generat de programul uuencode și are un format similar, cu excepția traducerii reale a caracterelor:

Antetul este schimbat în

begin-base64 <mode> <file>

remorca devine

====

iar liniile dintre acestea sunt codificate cu caractere alese din

ABCDEFGHIJKLMNOP
QRSTUVWXYZabcdef
ghijklmnopqrstuv
wxyz0123456789+/

O altă alternativă este Ascii85 , care codifică patru caractere binare în cinci caractere ASCII. Ascii85 este utilizat în formatele PostScript și PDF .

Dezavantaje

uuencoding ia 3 octeți pre-formatați și îi transformă în 4 și adaugă, de asemenea, etichete de început / sfârșit, nume de fișier și delimitatori . Acest lucru adaugă cel puțin 33% din datele generale comparativ cu sursa singură, deși acest lucru poate fi cel puțin oarecum compensat prin comprimarea fișierului înainte de uuencodarea acestuia.

Suport în Python

În Python Suporturile de limba uuencoding folosind modulul de codec - uri cu un codec „uu“:

Pentru Python 2 (depreciat / apus de la 1 ianuarie 2020) :

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

end

$

Pentru Python 3, unde modulul codecs trebuie importat și utilizat direct :

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

Suport în Perl

Cele Perl sprijină în limba uuencoding nativ folosind pachetul () și dezarhivați () operatori cu șirul de format „u“:

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

Decodarea base64 cu despachetare poate fi realizată, de asemenea, prin traducerea caracterelor:

$ perl -e '$a="Q2F0"; $a=~tr#A-Za-z0-9+/\.\_##cd; # remove non-base64 chars
> $a=~tr#A-Za-z0-9+/# -_#; # translate sets
> print unpack("u",pack("C",32+int(length($1)*6 / 8)) . $1) while($a=~s/(.{60}|.+)//);'
Cat

Vezi si

Referințe

linkuri externe