Ce? O introducere practică la codarea de bază

La o vârstă fragedă, învățăm să ne bazăm pe degetele noastre - începând cu 1-5, apoi cu 1-10, și poate că, dacă sunteți cu adevărat întreprinzători ca un copil, veți învăța să numărați la 20, 30 și după . Nimeni nu încearcă să ne lumineze că facem, de fapt, niște ipoteze matematice mai complexe; știm cu toții Baza10, pentru a fi precis.

În acest articol, vom începe prin a obține o înțelegere mai rotunjită a Base10 și a structurii sale, apoi vom discuta binar (Base2, blocurile de calcul). În cele din urmă, vom termina lucrurile vorbind despre Base32 și Base64. În fiecare etapă vom discuta avantajele și utilizările pentru fiecare tip.


De ce Base10

Avem 10 degete.

Deci, de ce am ales Base10? Nu este pentru că există formatele de litere 0-9; care a fost de fapt un rezultat al alegerii de a folosi Base10. De fapt, este cel mai probabil datorită procesului de învățare pe care l-am stabilit mai sus - avem 10 degete. Acest lucru face mult mai ușor să înțeleagă sistemul.

Deci, hai să vorbim puțin despre cum este structurat Base10. Aceasta va fi fundamentul înțelegerii pe care o vom folosi în discuțiile ulterioare.

Începând cu 0, numărăm până la 9, umplând coloana "1". Odată ce coloana este plină (are 9), adică maximul pentru coloană. Așa că trecem la următoarea coloană (spre stânga) și începem la 1. Pentru toate intențiile și scopurile, putem postula că există un număr infinit de zerouri înaintea primei noastre coloane semnificative. Cu alte cuvinte, "000008" este același cu "8". Așa cum se umple fiecare coloană, următoarea coloană este apoi mărită cu una și începem din nou la coloana anterioară pentru ao umple din nou în același mod ca înainte. În mod specific, coloana 1s crește de la 0-9, apoi se adaugă încă zece la coloana zeci. Acest lucru este continuat și dacă coloana de zeci este la 9 și coloana 1s este la 9, 1 este adăugată la coloana 100 și așa mai departe. Știm cu toții această bucată de pizzel.

Luați în considerare numărul 1020. Pornind de la dreapta, putem înțelege acest lucru ca fiind "0 * 1 + 2 * 10 + 0 * 100 + 1 * 1000". Acum, ia în considerare numărul 5.378. Putem înțelege acest lucru ca fiind "8 * 1 + 7 * 10 + 3 * 100 + 5 * 1000". O funcție generalizată pentru a înțelege apoi Base10 este după cum urmează:

(10 ridicate la puterea coloanei din dreapta -1) * (numărul găsit în coloană)

Prin urmare, dacă există 6 în coloana a 5-a din dreapta, 10 ^ 4 * 6 = 60.000.

Putem vedea că aceasta este o formulă generalizabilă pentru înțelegerea tuturor sistemelor de bază.


Baza 2 (binară)

Acesta este motivul pentru care aceste sisteme sunt denumite Base (N).

Următorul sistem despre care vom vorbi este Base2 sau binar. Binarul este format din două cifre, 0 și 1. Aceasta se pretează bine calculului din mai multe motive, în special deoarece calculatoarele se bazează pe comutatoare care au două stări: pornite sau oprite. Binar este sistemul cel mai de bază necesar pentru toate operațiile logice (cred că "adevărat" și "fals").

Deci, cum funcționează binar? Luați formula de sus și, în loc să folosiți zece, utilizați două. Și pe această notă, acesta este motivul pentru care aceste sisteme sunt denumite Base (N).

(2 ridicate la puterea coloanei din dreapta -1) * (numărul găsit în coloană)

Deci, să luăm numărul arbitrar 1001101 în binar și să aplicăm această formulă.

(1 x 1) + (0 x 2) + (1 x 4) + (1 x 8) + (16 x 0) + (32 x 0) + (64 x 1) = 77

"Așteaptă!", Te gândești. "Dacă binar este tot ce sunt compuse computerele, cum ai scrie scrisori în binar?" Buna intrebare. Acest lucru ne aduce la baza introducerii Base16.


Base16

Ar fi o reprezentare de o singură cifră de 10.

Să vedem, pentru o clipă, că am avut 11 degete. Vom folosi în mod natural un sistem de bază11. În afară de faptul că părea inconfortabil de greu de imaginat în prezent, ce alte implicații ar avea acest lucru? Poate că cea mai importantă implicație este că am fi avut o altă creștere de peste 9 în coloana 1s. Dar nu ar fi un "10", deoarece 10 nu este limitat la coloana 1s. În schimb, ar fi o reprezentare de o singură cifră de 10. Și, de fapt, exact așa funcționează literele în sistemele de bază dincolo de Base10 până la Base62, cu unele avertismente (la care vom ajunge mai târziu când vorbim despre Base32).

Să ne imaginăm folosind Base11, dar să substituim un capital A pentru singura cifră "10" discutată mai sus. Cum am scrie numărul 54?

Din moment ce știm că prima coloană din stânga este coloana "11", am începe prin împărțirea lui 54 cu unsprezece, ceea ce ne dă 4 cu un rest de 10. Dacă "A" reprezintă 10, în Base11 va fi reprezentat numărul 54 ca 4A.

Să facem asta în sens invers, cu formula pe care am folosit-o anterior.

(11 ridicat la puterea coloanei din dreapta - 1) * (numărul găsit în coloană)

În acest caz, ar însemna:

(1 x A) + (4 x 11)

Acum, înlocuiți 10 pentru A:

(1 x 10) + (4 x 11) = 54

hexazecimal

Cum este util acest lucru, te întrebi? Baza 11 nu poate fi neapărat utilă (cu excepția cazului în care aveți o structură de date care ar beneficia de un sistem Base11). Cu toate acestea, Base16 este utilizat în sistemele informatice pentru mai multe scopuri. De asemenea, cunoscut sub numele de hexazecimal, Base16 folosește numerele 0-9 urmate de literele a-f (fără majuscule). În special, veți vedea hexadecimale folosite pentru a defini culorile RGB în CSS (și în majoritatea widget-urilor de selectare a culorilor pe software-ul desktop), cu două cifre pentru fiecare canal roșu, verde și albastru.

Deci, de exemplu, # A79104 ar produce r = A7, g = 91, b = 04. În zecimale, aceasta ar fi echivalentă cu r = 167, g = 145, b = 4; culoarea rezultată ar fi un galben auriu. Două cifre hexazecimale pot fi reprezentate de 256 numere diferite și astfel există combinații posibile de numere de 256 ^ 3 (16,777,216) în sistemul hexazecimal RGB, reprezentat de numai 6 caractere (sau 3 dacă utilizați metoda de comenzi rapide, fiecare dintre cele trei cifre este implicit dublat;. # 37d == # 3377dd).

Baza 16 este adesea folosită în limbile de asamblare, care este limba de programare accesibilă cel mai jos. Deoarece hexadecimalele sunt ușor de convertit în binar, acestea reprezintă o modalitate mai ușoară de a scrie instrucțiuni de cod de asamblare.

Notă: Același lucru este, în general, valabil și pentru popularitatea Base32 și Base64; aceste codificări sunt folosite pentru că sunt în mod natural mai bune pentru datele binare (deoarece sunt puteri de 2) și pentru că există cel puțin 64 de caractere sigure (și nu există 128 de caractere sigure) pe aproape fiecare calculator.

Pentru un exemplu hexazecimal, luați numărul 1100 în hexazecimal, echivalentul a 4352 în zecimal. Același număr în binar este 0001 0001 0000 0000. Convertirea de la hexazecimal la binar este o operație simplă de a folosi un tabel de conversie, unde 0 în hexazecimal este 0000 în binar și F în hexazecimal este 1111 în binar.

Rețineți că cifrele 0 din partea stângă a primului număr indică faptul că numărul binar se află în biți, în cazul în care pozițiile 0 din stânga sunt pur și simplu coloane goale. În principiu, acestea nu sunt necesare; cu toate acestea, veți întâlni binar scris în acest mod aproape exclusiv. Această practică se numește padding și se practică deoarece lungimea datelor este necunoscută și ar putea cauza probleme atunci când apar mai multe transmisii de date; prin completarea șirului final, dimensiunea datelor este garantată, de exemplu, de 4 biți (pentru binare). Împingerea apare și în alte scheme de codificare utilizate și specificate; în special, Base32 și Base64 utilizează ambele semne egale ("=") pentru umplere.


Base32

S-ar putea presupune că Base32 este numerele 0-9 și apoi primele 22 de litere ale alfabetului (până la V).

Amintiți-vă când am menționat mențiunea de mai sus? Aceasta este avertismentul: cea mai acceptată definiție Base32 este de fapt o codificare care începe cu primele 26 de litere ale alfabetului și se termină cu numerele 2-7. Acest lucru este definit în Solicitarea de comentarii a comitetului pentru Internet Engineering Task Force (RCFC) 4648, care definește, de asemenea, Base16 și Base64. Notă, diferența este că codarea pentru 0 este A, nu 0. Pentru a codifica un șir în Base32, se întâmplă următoarele instrucțiuni.

Mai întâi, șirul care urmează a fi codificat este împărțit în blocuri de 5 octeți (40 biți în binar). Scrisorile sunt reprezentate de blocuri de 8 biți în ASCII (standardul pentru computere), astfel încât pentru fiecare 5 litere există 40 de biți. (Această definiție pe 8 biți pentru fiecare literă permite un total de 255 de caractere în ASCII.)

Apoi, împărțiți aceste 40 de biți în 8 blocuri de cinci biți; astfel încât, pentru fiecare 5 litere, există 8 blocuri pentru a codifica în base32. Hartă fiecare dintre aceste blocuri într-un caractere de caractere pe 5 biți în alfabetul Base32. De exemplu, dacă blocul de cinci biți este 00010 (sau zecimal 2), caracterul mapat este litera, c. Dacă blocul de cinci biți este 01010 (zecimal 10), caracterul mapat este litera K.

Să aplicăm acești pași la șirul "yessir".

Caracter ASCII zecimal ASCII binar pe 8 biți
y 89 01111001
e 101 01100101
s 115 01110011
s 115 01110011
eu 105 01101001
r 114 01110010

Să luăm reprezentările binare și să le concatenăm acum, împărțind-le în grupuri pe 5 biți

 01111 00101 10010 10111 00110 11100 11011 01001 01110 010 (00) null null null null null null null

O notă privind cele de mai sus: deoarece specificația definește că codificarea trebuie făcută în bucăți de câte 8 bucăți de 5 biți, trebuie să adăugăm un pad cu 0 dacă numărul de biți nu este divizibil cu 5 (de aici 010 (00) pe a doua linie) și cu = în cazul în care numărul de bucăți nu este divizibil cu 8. Valorile "nul" vor fi înlocuite cu caracterele "=".

Fiecare dintre aceste numere binare pe 5 biți este caracterizată de un caracter din alfabetul pe 32 de biți; în mod specific, producția pentru da domnule va fi PFSXG43JOI ======

Un proces similar este urmat pentru Base64. Există câteva diferențe fundamentale între Base32 și Base64. Base64 include literele A-Z, a-z, numerele 0-9 și simbolurile + și /. Așa cum am menționat anterior, simbolul "=" este utilizat pentru umplere. Diferențele sunt, în principal, că toate literele sunt sensibile la litere mari și mici, iar toate cifrele sunt folosite (în loc de subsetul 2-7). Se adaugă, de asemenea, simbolurile + și /.

Procesul de codare Base64 are șiruri de 24 de biți (3 litere) și le rupe în patru bucăți de 6 biți, mapând numărul binar rezultat în alfabetul Base64. Deci, permiteți să aruncați o privire la exemplul nostru precedent, șirul "yessir".

 8-bit binar: 01111001 01100101 01110011 01110011 01101001 01110010 Bucăți pe 6 biți: 011110 010110 010101 110011 011100 110110 100101 110010 Base64: eWVzc2ly

Există câteva lucruri importante de remarcat. Mai întâi, Base64 are sensibilitatea la minuscule. În al doilea rând, deoarece numărul de biți (48) a fost divizibil cu 6, nu a fost necesară nicio depunere de biți. Numărul bucăților de 6 biți a fost de asemenea divizibil de patru (ceea ce înseamnă că numărul de caractere de intrare a fost divizibil cu 3), astfel că nu a fost necesară nici o umplutură nulă ("=") fie.


Un rezumat al Base16, Base32 și Base64

Aceste baze bazate pe binare sunt folosite în cadrul structurilor de programare.

Aceste baze bazate pe binare sunt folosite în cadrul structurilor de programare. Datele binare sunt codificate în aceste baze pentru a asigura fidelitatea transferului și pentru a bloca erorile care ar putea apărea din transferul accidental de date binare necomodat. Ei se bazează pe tabele de caractere bazate pe standarde și sunt garantate numai dacă atât codificatorul, cât și decodorul folosesc aceeași masă; de exemplu, există versiuni modificate acceptate pe scară largă ale base32, inclusiv una de Douglas Crockford care schimbă unele dintre caracterele acceptabile, inclusiv litera "u", pentru a evita obscenitatea neintenționată.


Codificare în practică

În plus față de utilizarea numerelor hexazecimale în mod regulat pentru culorile CSS, Base32 și Base64 sunt utilizate pe web în mod consecvent. Deși procesul oficial de codificare pentru Base32 și Base64 umflă dimensiunea șirului, numerele de codare din Base64 sau Base32 pot fi foarte benefice pentru lucruri precum scurtarea adresei URL, unde o adresă URL ar putea indica / foo / id. Luați în considerare următoarele numere zecimale și echivalentele lor Base32 și Base64.

Zecimal Base16 Base32
20 U U
50 bs y
967 6h PH
745619 WYET C2CT
7241930 G5AGK boDK
798312345192 xhpr7lti LnfH65o

După cum puteți vedea, există avantaje semnificative pentru utilizarea Base64 sau Base32 pentru scurtarea numărului. Atunci când fiecare caracter are numărul, folosind aceste codări de bază vă permite să salvați caractere. În multe cazuri, numărul codificat este de aproximativ jumătate din lungimea numărului necodificat.


O notă privind baza Base62 și baza de date modificată prin URL 64

Ce alte tipuri de aplicații web ați putea folosi pentru aceste codificări?

Dacă Base64 codifică numărul 959, rezultatul este O /. Desigur, aceasta nu este o valoare url-safe din cauza "/", astfel încât o adresă urlând spre O / nu va fi decodificată ca O /, ci ca O (care este valoarea zecimală 14). Aceasta ar învinge și scopul de a codifica "/" ca echivalentul codului său ASCII (% 47%), deoarece acest lucru prelungește semnificativ URL-ul. Două soluții principale au crescut pentru a combate această problemă. Una este o varianta url-safe a Base64 care inlocuieste + si / cu - si respectiv _. De asemenea, elimină specificația adăugării = caractere pentru umplere. Cealaltă opțiune este de a merge la o codare Base62, care păstrează aproape toate beneficiile Base64 și elimină + și /. Cu toate acestea, codificarea Base62 nu este la fel de ușor de aplicat ca un înlocuitor binar de transmisie și, prin urmare, este mult mai puțin populară.


Concluzie

Asta-l înfășoară! Acum, aveți o cunoaștere fundamentală a sistemelor de bază, în special în ceea ce privește codificarea datelor binare. Ce alte tipuri de aplicații web ați putea folosi pentru aceste codificări?

Cod