Base Cosa? Un'introduzione pratica alla codifica di base

In giovane età, impariamo a contare sulle nostre dita - iniziando con 1-5, poi 1-10, e forse, se sei particolarmente intraprendente come un bambino, imparerai a contare fino a 20, 30, e oltre . Nessuno tenta mai di illuminarci che stiamo facendo alcune ipotesi matematiche più complesse; conosciamo tutti Base10, per la precisione.

In questo articolo, inizieremo acquisendo una comprensione più approfondita di Base10 e della sua struttura, quindi discuteremo di binario (Base2, i blocchi costitutivi dell'informatica). Infine, finiremo le cose parlando di Base32 e Base64. In ogni fase discuteremo i vantaggi e gli usi per ciascun tipo.


Perché Base10

Abbiamo 10 dita.

Quindi, perché abbiamo scelto Base10? Non è perché le forme di lettera 0-9 esistono; quello era in realtà il risultato della scelta di usare Base10. In realtà, è molto probabilmente a causa del processo di apprendimento che abbiamo deciso sopra: abbiamo 10 dita. Questo rende molto più facile capire il sistema.

Parliamo un po 'di come Base10 è effettivamente strutturato. Questo sarà il fondamento della comprensione che useremo nella discussione successiva.

A partire da 0, contiamo fino a 9, riempiendo la colonna "1's". Una volta che la colonna è piena (ha 9), quello è il massimo per la colonna. Quindi passiamo alla colonna successiva (a sinistra) e iniziamo a 1. A tutti gli effetti, possiamo postulare che ci sia un numero infinito di zeri iniziali prima della nostra prima colonna significativa. In altre parole, "000008" è uguale a "8". Quindi, man mano che ogni colonna si riempie, la colonna successiva viene aumentata di uno, e ricominciamo dalla colonna precedente per riempirla di nuovo nello stesso modo di prima. Nello specifico, la colonna 1s aumenta da 0-9, e quindi un altro dieci viene aggiunto alla colonna delle decine. Questo viene continuato, e se la colonna delle decine è a 9 e la colonna 1s è a 9, 1 viene aggiunta alla colonna dei 100 e così via. Conosciamo tutti questo pezzo di pizzico.

Considera il numero 1020. Partendo da destra, possiamo capire come "0 * 1 + 2 * 10 + 0 * 100 + 1 * 1000". Ora, considera il numero 5,378. Possiamo capire come "8 * 1 + 7 * 10 + 3 * 100 + 5 * 1000". Una funzione generalizzata per comprendere Base10, quindi, è la seguente:

(10 elevato alla potenza della colonna da destra -1) * (il numero trovato nella colonna)

Pertanto, se c'è un 6 nella 5a colonna da destra, 10 ^ 4 * 6 = 60.000.

Possiamo vedere che questa è una formula generalizzabile per comprendere tutti i sistemi di base.


Base2 (Binario)

Questo è il motivo per cui questi sistemi sono indicati come Base (N).

Il prossimo sistema di cui parleremo è Base2, o binario. Il binario consiste di due cifre, 0 e 1. Ciò si presta bene al calcolo per molte ragioni, la maggior parte fondamentalmente perché i computer si basano su switch che hanno due stati: acceso o spento. Il binario è il sistema più basilare necessario per tutte le operazioni logiche (pensa "vero" e "falso").

Quindi, come funziona il binario? Prendi la formula dall'alto, e invece di usare dieci, usa due. E su questa nota, questo è il motivo per cui questi sistemi sono indicati come Base (N).

(2 elevato alla potenza della colonna da destra -1) * (il numero trovato nella colonna)

Quindi, prendiamo il numero arbitrario 1001101 in binario e applichiamo questa formula.

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

"Aspetta!", Stai pensando. "Se il binario è tutto ciò di cui sono fatti i computer, come scriverebbe lettere in binario?" Buona domanda. Questo ci porta davvero alla nostra introduzione di Base16.


Base16

Sarebbe invece una rappresentazione a una cifra di 10.

Immaginiamo, per un momento, di avere 11 dita. Saremmo naturalmente usando un sistema di Base11. Oltre a sembrare al momento difficile da immaginare, quali altre implicazioni avrebbe questo? Forse l'implicazione più importante è che avremmo avuto un altro incremento oltre 9 nella colonna 1s. Ma non sarebbe un "10", perché 10 non è limitato alla colonna 1s. Sarebbe invece una rappresentazione a una cifra di 10. E, in effetti, è esattamente come funzionano le lettere nei sistemi di base oltre Base10 fino a Base62, con alcune avvertenze (che vedremo in seguito quando parliamo di Base32).

Immaginiamo di usare Base11, ma sostituire la A maiuscola con il "10" a una cifra di cui abbiamo parlato sopra. Come scriveremo il numero 54?

Poiché sappiamo che la prima colonna da sinistra è la colonna "11", inizieremo dividendo 54 per undici, il che ci dà 4 con un resto di 10. Se "A" rappresenta 10, in Base11 il numero 54 sarebbe rappresentato come 4A.

Facciamo ciò al contrario, con la formula che abbiamo usato in precedenza.

(11 elevato alla potenza della colonna da destra - 1) * (il numero trovato nella colonna)

In questo caso, ciò significherebbe:

(1 * A) + (4 * 11)

Ora, sostituisci 10 per A:

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

esadecimale

Com'è utile, ti stai chiedendo? Base11 potrebbe non essere necessariamente utile (a meno che tu non abbia un qualche tipo di struttura dati che trarrebbe vantaggio da un sistema Base11). Tuttavia, Base16 viene utilizzato in tutti i sistemi informatici per molteplici scopi. Conosciuto anche come esadecimale, Base16 utilizza i numeri 0-9 seguiti dalle lettere a-f (senza distinzione tra maiuscole e minuscole). In particolare, vedrai esadecimali usati per definire i colori RGB nei CSS (e nella maggior parte dei widget color-picker sul software desktop), con due cifre per ciascuno dei canali rosso, verde e blu.

Quindi, per esempio, # A79104 produrrebbe r = A7, g = 91, b = 04. In decimali, questo sarebbe equivalente a r = 167, g = 145, b = 4; il colore risultante sarebbe un giallo dorato. Due cifre esadecimali messe insieme possono rappresentare 256 diversi numeri, e quindi ci sono 256 ^ 3 (16.777.216) combinazioni di numeri possibili nel sistema esadecimale RGB, rappresentate da soli 6 caratteri (o 3 se si utilizza il metodo di scelta rapida, in cui ciascuna delle tre cifre è implicitamente raddoppiato, ad es. # 37d == # 3377dd).

Base16 è spesso usato nei linguaggi di assemblaggio, che è il linguaggio di programmazione accessibile di più basso livello. Poiché gli esadecimali sono facili da convertire in binari, sono un modo più semplice per scrivere istruzioni di codice assembly.

Nota: Lo stesso è generalmente vero per la popolarità di Base32 e Base64; queste codifiche vengono utilizzate perché sono naturalmente migliori per i dati binari (perché sono le potenze di 2) e perché ci sono almeno 64 caratteri sicuri (e non ci sono 128 caratteri sicuri) su quasi tutti i computer.

Per un esempio esadecimale, prendi il numero 1100 in esadecimale, che equivale a 4352 in decimale. Lo stesso numero in binario è 0001 0001 0000 0000. La conversione da esadecimale a binario è una semplice operazione di utilizzo di una tabella di conversione, dove 0 in esadecimale è 0000 in binario e F in esadecimale è 1111 in binario.

Notare che gli 0 a sinistra del primo numero indicano che il numero binario è in bit, dove gli 0 all'estrema sinistra sono semplicemente colonne vuote. Fondamentalmente, questi non sono necessari; tuttavia, incontrerai il binario scritto in questo modo quasi esclusivamente. Questa pratica è chiamata padding, ed è praticata perché la lunghezza dei dati è sconosciuta e quindi potrebbe causare problemi quando si verificano più trasmissioni di dati; riempendo la stringa finale, la dimensione dei dati è garantita, ad esempio 4 bit (per binario). Il riempimento avviene anche in altri schemi di codifica comunemente usati e basati su specifiche; in particolare, Base32 e Base64 usano entrambi il segno di uguale ("=") per il riempimento.


Base32

Si potrebbe supporre che Base32 sia i numeri 0-9 e quindi le prime 22 lettere dell'alfabeto (fino a V).

Ricordi quando menzionammo l'avvertenza sopra? Questo è l'avvertenza: la definizione Base32 più comunemente accettata è in realtà una codifica che inizia con le prime 26 lettere dell'alfabeto e termina con i numeri 2-7. Questo è definito in Richiesta di commenti della Task Force di Internet Engineering (RCFC) 4648, che definisce anche Base16 e Base64. Nota, la differenza è che la codifica per 0 è A, non 0. Per codificare una stringa in Base32, si verificano le seguenti istruzioni.

Innanzitutto, la stringa da codificare viene suddivisa in blocchi di 5 byte (40 bit in binario). Le lettere sono rappresentate da blocchi di 8 bit in ASCII (lo standard per i computer), quindi per ogni 5 lettere ci sono 40 bit. (Questa definizione a 8 bit per ogni lettera consente un totale di 255 caratteri in ASCII.)

Quindi, dividi questi 40 bit in 8 blocchi a cinque bit; quindi, per ogni 5 lettere, ci sono 8 blocchi da codificare in base32. Mappare ciascuno di questi blocchi a un mapping di caratteri a 5 bit nell'alfabeto Base32. Ad esempio, se il blocco a cinque bit è 00010 (o decimale 2), il carattere mappato è la lettera, c. Se il blocco a cinque bit è 01010 (decimale 10), il carattere mappato è la lettera K.

Applichiamo questi passaggi alla stringa "yessir".

Personaggio Decimale ASCII Binario ASCII a 8 bit
y 89 01111001
e 101 01100101
S 115 01110011
S 115 01110011
io 105 01101001
r 114 01110010

Prendiamo le rappresentazioni binarie e le concateniamo ora, dividendole in gruppi di 5 bit

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

Una nota su quanto sopra: poiché la specifica definisce che la codifica deve essere eseguita in blocchi di 8 pezzi a 5 bit, dobbiamo eseguire il pad con 0 se il numero di bit non è divisibile per 5 (da cui il 010 (00) sulla seconda riga) e con = se il numero di blocchi non è divisibile per 8. I valori "null" saranno sostituiti dal carattere padding, "=".

Ognuno di questi numeri binari a 5 bit viene mappato su un carattere nell'alfabeto a 32 bit; in particolare, l'output per si signore sarebbe PFSXG43JOI ======

Un processo simile è seguito per Base64. Esistono alcune differenze fondamentali tra Base32 e Base64. Base64 include le lettere A-Z, a-z, i numeri 0-9 e i simboli + e /. Come accennato in precedenza, il simbolo "=" viene utilizzato per il riempimento. Le differenze consistono principalmente nel fatto che tutte le lettere fanno distinzione tra maiuscole e minuscole e vengono utilizzate tutte le cifre (anziché il sottoinsieme 2-7). Vengono inoltre aggiunti i simboli + e /.

Il processo di codifica Base64 richiede stringhe a 24 bit (3 lettere) e le suddivide in quattro blocchi a 6 bit, mappando il numero binario risultante nell'alfabeto Base64. Quindi, diamo un'occhiata al nostro esempio precedente, la stringa "yessir".

 Binario a 8 bit: 01111001 01100101 01110011 01110011 01101001 01110010 blocchi a 6 bit: 011110 010110 010101 110011 011100 110110 100101 110010 Base64: eWVzc2ly

Ci sono alcune cose importanti da notare. Innanzitutto, Base64 fa distinzione tra maiuscole e minuscole. In secondo luogo, poiché il numero di bit (48) era divisibile per 6, non era necessario alcun bit-padding. Il numero di blocchi a 6 bit era divisibile anche per quattro (il che significa anche che il numero di caratteri di input era divisibile per 3), quindi non era necessario alcun riempimento nullo ("=").


Un riepilogo di Base16, Base32 e Base64

Queste basi binary-friendly sono sfruttate attraverso strutture di programmazione.

Queste basi binary-friendly sono sfruttate attraverso strutture di programmazione. I dati binari sono codificati in queste basi per garantire la fedeltà del trasferimento e bloccare gli errori che potrebbero derivare dal trasferimento accidentale di dati binari non codificati. Si basano su tabelle di caratteri basate su standard e funzionano solo se sia l'encoder che il decoder utilizzano la stessa tabella; per esempio, ci sono versioni modificate di base32 ampiamente accettate, inclusa una di Douglas Crockford che modifica alcuni dei caratteri accettabili, inclusa la lettera "u" per evitare l'oscenità involontaria.


Codifica in pratica

Oltre a utilizzare regolarmente numeri esadecimali per i colori CSS, Base32 e Base64 vengono utilizzati in modo coerente sul Web. Anche se il processo di codifica ufficiale per Base32 e Base64 aumenta la dimensione della stringa, codificare i numeri in Base64 o Base32 può essere molto utile per cose come l'accorciamento dell'URL, dove un URL potrebbe puntare a / foo / id. Considera i seguenti numeri decimali e i loro equivalenti Base32 e Base64.

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

Come puoi vedere, ci sono vantaggi significativi nell'usare Base64 o Base32 per accorciare il numero. Quando ogni personaggio conta, l'uso di queste codifiche di base ti consente di salvare i personaggi. In molti casi, il numero codificato è circa la metà della lunghezza del numero non codificato.


Una nota su Base62 e Url-Modified Base64

Quali altri tipi di applicazioni web troveresti usi per queste codifiche?

Se Base64 codifica il numero 959, il risultato è O /. Naturalmente, questo non è un valore di url-safe a causa del "/", quindi un url che punta a O / non sarebbe decodificato come O /, ma come O (che è il valore decimale 14). Sconfiggerebbe anche lo scopo di codificare la "/" come equivalente in codice ASCII (% 47%), in quanto aumenta significativamente l'URL. Due soluzioni principali sono aumentate per combattere questo problema. Una è una variante url-safe di Base64 che sostituisce rispettivamente + e / con - e _ ,. Rimuove anche le specifiche di aggiungere = caratteri per il riempimento. L'altra opzione è quella di passare a una codifica Base62, che conserva quasi tutti i vantaggi di Base64 e rimuove i + e /. Tuttavia, la codifica Base62 non è facilmente applicabile come sostituto di una trasmissione binaria, e quindi è molto meno popolare.


Conclusione

Questo lo avvolge! Ora, hai una conoscenza fondamentale dei sistemi di base, in particolare quando si applicano alla codifica dei dati binari. Quali altri tipi di applicazioni web troveresti usi per queste codifiche?