Base hva? En praktisk introduksjon til basekoding

I en ung alder lærer vi å stole på fingrene - starter med 1-5, deretter 1-10, og kanskje, hvis du er spesielt underholdende som smårolling, lærer du å telle til 20, 30 og utover . Ingen forsøker å opplyse oss om at vi faktisk lager noen mer komplekse matematiske forutsetninger; vi alle vet Base10, for å være presis.

I denne artikkelen starter vi med å få en mer avansert forståelse av Base10 og dens struktur, og vi diskuterer binære (Base2, byggeklossene i databehandling). Til slutt vil vi fullføre ting ved å snakke om Base32 og Base64. På hvert stadium diskuterer vi fordelene og bruksområder for hver type.


Hvorfor Base10

Vi har 10 fingre.

Så hvorfor valgte vi Base10? Det er ikke fordi brevformene 0-9 eksisterer; Det var faktisk et resultat av valget å bruke Base10. Faktisk er det mest sannsynlig på grunn av læringsprosessen vi bestemte oss over - vi har 10 fingre. Dette gjør det mye enklere å forstå systemet.

Så, la oss snakke litt om hvordan Base10 faktisk er strukturert. Dette vil være grunnlaget for å forstå at vi skal bruke i den etterfølgende diskusjonen.

Fra 0, teller vi opp til 9, fyller "1 s" kolonnen. Når kolonnen er full (har 9), er det maksimum for kolonnen. Så vi flytter til neste kolonne (til venstre), og starter ved 1. For all hensikt kan vi postulere at det er et uendelig antall ledende nuller før vår første signifikante kolonne. Med andre ord er "000008" det samme som "8". Når hver kolonne fylles opp, blir den neste kolonnen deretter økt med en, og vi starter tilbake i forrige kolonne for å fylle den opp igjen på samme måte som før. Spesielt øker kolonnen 1s fra 0-9, og deretter legges ytterligere ti til tiene kolonnen. Dette fortsetter, og hvis tiene kolonnen er på 9 og kolonnen 1s er 9, legges 1 til 100-tallskolonnen og så videre. Vi vet alle denne delen av pizzelen.

Vurder tallet 1020. Fra høyre kan vi forstå dette som "0 * 1 + 2 * 10 + 0 * 100 + 1 * 1000". Nå, vurder nummeret 5,378. Vi kan forstå dette som "8 * 1 + 7 * 10 + 3 * 100 + 5 * 1000". En generalisert funksjon for å forstå Base10 er da som følger:

(10 hevet til kraften i kolonnen fra høyre -1) * (tallet som er funnet i kolonnen)

Derfor, hvis det er en 6 i den femte kolonnen fra høyre, 10 ^ 4 * 6 = 60.000.

Vi kan se at det er en generaliserbar formel for å forstå alle basissystemene.


Base2 (binær)

Dette er grunnen til at disse systemene blir referert til som Base (N).

Det neste systemet vi skal snakke om, er Base2 eller binært. Binær består av to sifre, 0 og 1. Dette gir seg god til databehandling av mange grunner, mest grunnleggende fordi datamaskiner stole på brytere som har to tilstander: på eller av. Binær er det mest grunnleggende systemet som trengs for alle logiske operasjoner (tenk "sant" og "falskt").

Så, hvordan virker binær arbeid? Ta formelen ovenfra, og i stedet for å bruke ti, bruk to. Og på dette notatet er dette grunnen til at disse systemene blir referert til som Base (N).

(2 hevet til kraften i kolonnen fra høyre -1) * (tallet som er funnet i kolonnen)

Så, la oss ta det vilkårlige nummeret 1001101 i binær, og bruk denne formelen.

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

"Vent!", Tenker du. "Hvis binær er alt som datamaskiner er laget av, hvordan ville du skrive bokstaver i binær?" Godt spørsmål. Dette bringer oss faktisk til introduksjonen av Base16.


Base16

Det ville i stedet være en ensifret representasjon på 10.

La oss for et øyeblikk forestille oss at vi hadde 11 fingre. Vi ville naturligvis bruke et system av Base11. Foruten det virker ubehagelig vanskelig å forestille seg for tiden, hvilke andre implikasjoner vil dette ha? Kanskje den viktigste implikasjonen er at vi ville ha hatt en annen økning utover 9 i kolonnen 1s. Men det ville ikke være en "10", fordi 10 ikke er begrenset til kolonnen 1s. Det vil i stedet være en ensifret representasjon på 10. Og faktisk er det akkurat hvordan bokstaver fungerer i basissystemer utover Base10 opp til Base62, med noen advarsler (som vi kommer til senere når vi snakker om Base32).

La oss forestille oss å bruke Base11, men erstatt hovedstaden A for den enkeltsifrede "10" vi diskuterte ovenfor. Hvordan skulle vi skrive nummer 54?

Siden vi vet at den første kolonnen fra venstre er kolonnen "11", begynner vi å dele 54 med elleve, noe som gir oss 4 med en rest på 10. Hvis "A" representerer 10, i Base11 vil nummer 54 bli representert som 4A.

La oss gjøre det i omvendt, med formelen vi brukte tidligere.

(11 hevet til kraften i kolonnen fra høyre - 1) * (tallet som er funnet i kolonnen)

I dette tilfellet vil det bety:

(1 * A) + (4 * 11)

Nå, erstatt 10 for A:

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

heksadesimale

Hvordan er dette nyttig, lurer du på? Base11 kan ikke nødvendigvis være nyttig (med mindre du har noen form for datastruktur som ville ha nytte av et Base11-system). Base16 brukes imidlertid i hele datasystemer til flere formål. Også kjent som heksadesimale, Base16 bruker tallene 0-9 etterfulgt av bokstavene a-f (ikke saksfølsom). Spesielt vil du se heksadecimaler som brukes til å definere RGB-farger i CSS (og i de fleste fargeplukkers widgets på stasjonær programvare), med to siffer for hver av kanalene rød, grønn og blå.

Så, for eksempel, # A79104 ville produsere r = A7, g = 91, b = 04. I decimaler vil dette være lik r = 167, g = 145, b = 4; Den resulterende farge vil være en gylden gul. To heksadesimale cifre satt sammen kan representere 256 forskjellige tall, og dermed er det 256 ^ 3 (16 777 216) mulige tallkombinasjoner i RGB-heksadesimale systemet, representert med bare 6 tegn (eller 3 hvis du bruker snarvei-metoden, hvor hver av tre siffer er implisitt doblet, f.eks. # 37d == # 3377dd).

Base16 brukes ofte i monteringsspråk, som er det laveste tilgjengelige programmeringsspråket. Fordi hexadecimaler er enkle å konvertere til binære, er de en enklere måte å skrive monteringsveiledning for.

Merk: Det samme gjelder generelt for populariteten til Base32 og Base64; Disse kodene brukes fordi de er naturlig bedre for binære data (fordi de er 2), og fordi det er minst 64 sikre tegn (og det er ikke 128 trykte tegn) på nesten alle datamaskiner.

For et heksadesimalt eksempel, ta tallet 1100 i heksadesimale, som tilsvarer 4352 i desimal. Det samme nummeret i binær er 0001 0001 0000 0000. Konvertering fra heksadesimale til binære er en enkel operasjon av å bruke en konverteringstabel, hvor 0 i hexadecimal er 0000 i binær og F i heksadesimale er 1111 i binær.

Legg merke til at 0-tallene til venstre for det første nummeret angir at binærnummeret er i biter, hvor 0-tallene til venstre er bare tomme kolonner. I utgangspunktet er disse ikke nødvendig; Men du vil møte binær skrevet på denne måten nesten utelukkende. Denne praksisen kalles polstring, og praktiseres fordi lengden på dataene er ukjent, og kan dermed forårsake problemer når flere datatransmisjoner oppstår; Ved å fylle den endelige strengen, er datastørrelsen garantert å være, for eksempel 4 bits lang (for binær). Padding forekommer også i andre vanlige og spesifikasjonsbaserte kodingsordninger; spesielt, Base32 og Base64 bruker begge likestilt ("=") for utfylling.


Base32

Man kan anta at Base32 er tallene 0-9 og deretter de første 22 bokstavene i alfabetet (opp til V).

Husk da vi nevnte advarselen ovenfor? Dette er en advarsel: Den vanligste Base32-definisjonen er faktisk en koding som starter med de første 26 bokstavene i alfabetet og slutter med tallene 2-7. Dette er definert i Internet Engineering Task Force's Request for Comments (RCFC) 4648, som også definerer Base16 og Base64. Merk, forskjellen er at kodingen for 0 er A, ikke 0. For å kode en streng i Base32, skjer følgende instruksjoner.

Først deles strengen som skal kodes i 5 byte blokker (40 bits i binær). Bokstaver er representert av 8 bit blokker i ASCII (standarden for datamaskiner), så for hver 5 bokstaver er det 40 bits. (Denne 8-bits-definisjonen for hvert brev tillater totalt 255 tegn i ASCII.)

Del deretter disse 40 bitene i 8 fem-bits blokker; så for hver 5 bokstaver er det 8 blokker å kode i base32. Kart hver av disse blokkene til en 5-biters karakterkartlegging i Base32-alfabetet. For eksempel, hvis fembitsblokken er 00010 (eller desimal 2), er det kartlagte tegnet brevet, c. Hvis fembitsblokken er 01010 (desimalt 10), er det kartlagte bokstavet K.

La oss bruke disse trinnene til strengen "yessir".

Karakter ASCII Decimal 8-biters ASCII-binær
y 89 01111001
e 101 01100101
s 115 01110011
s 115 01110011
Jeg 105 01101001
r 114 01110010

La oss ta de binære representasjonene og sammenkoble dem nå, splitte dem inn i 5-biters grupper

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

Et notat på ovenstående: fordi spesifikasjonen definerer at kodingen må gjøres i biter av 8 5-bits biter, må vi padde med 0 dersom antall biter ikke deles med 5 (dermed 010 (00) på den andre linjen) og med = hvis antall biter ikke er delelig med 8. "null" verdiene vil bli erstattet av polstringstegnet, "=".

Hver av disse 5-bit binære tallene kart til et tegn i 32-biters alfabetet; spesifikt, produksjonen for yessir ville vært PFSXG43JOI ======

En lignende prosess følges for Base64. Det er noen grunnleggende forskjeller mellom Base32 og Base64. Base64 inneholder bokstavene A-Z, a-z, tall 0-9, og symbolene + og /. Som nevnt tidligere brukes symbolet "=" for polstring. Forskjellene er hovedsakelig at alle bokstaver er bokstavsfølsomme, og alle sifre brukes (i stedet for delmengden 2-7). Symbolene + og / er også lagt til.

Base64-kodingsprosessen tar 24-biters strenger (3 bokstaver) og bryter dem inn i fire 6-bits biter, og kartlegger det resulterende binære nummeret til Base64-alfabetet. Så, la oss se på vårt forrige eksempel, strengen "yessir".

 8-biters binær: 01111001 01100101 01110011 01110011 01101001 01110010 6-bits biter: 011110 010110 010101 110011 011100 110110 100101 110010 Base64: eWVzc2ly

Det er noen viktige ting å merke seg. For det første er Base64 saksensitiv. For det andre, fordi antall biter (48) var delelig med 6, var det ikke nødvendig med bitpoldering. Antallet 6 bitbiter var også delbart med fire (hvilket også betyr at antall inntastingspersoner var delbart med 3), slik at ingen null ("=") polstring var nødvendig heller.


Et sammendrag av Base16, Base32 og Base64

Disse binærvennlige basene benyttes i hele programmeringsstrukturen.

Disse binærvennlige basene benyttes i hele programmeringsstrukturen. Binære data er kodet i disse basene for å sikre overføringens troskap og blokkere mot feil som kan oppstå ved uhell ukodet binær dataoverføring. De stole på standardbaserte tabeller med tegn, og er bare garantert å fungere hvis både koderen og dekoderen bruker det samme bordet; for eksempel er det allment aksepterte modifiserte versjoner av base32, inkludert en av Douglas Crockford som endrer noen av de akseptable tegnene, inkludert bokstaven "u" for å unngå utilsiktet obscenity.


Koding i praksis

I tillegg til å bruke heksadesimale tall på jevnlig basis for CSS-farger, brukes Base32 og Base64 konsekvent på nettet. Selv om den offisielle kodingsprosessen for Base32 og Base64 oppløser størrelsen på strengen, kan kodende tall i Base64 eller Base32 være svært gunstig for ting som URL-kortslutning, der en nettadresse kan peke til / foo / id. Vurder følgende desimalnumre og deres Base32- og Base64-ekvivalenter.

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

Som du kan se, er det signifikante fordeler med å bruke Base64 eller Base32 for nummerforkorting. Når hvert tegn teller, kan du ved hjelp av disse grunnkodingene lagre tegn. I mange tilfeller er det kodede nummer omtrent halvparten av det ikke-kodede nummerets lengde.


En note på Base62 og Url-Modified Base64

Hvilke andre typer webapplikasjoner vil du finne bruker for disse kodene?

Hvis du baserer Base64 på tallet 959, er resultatet O /. Selvfølgelig er dette ikke en url-sikker verdi på grunn av "/", så en url som peker på O / vil ikke bli dekodet som O /, men som O (som er desimalverdien 14). Det ville beseire hensikten å også kode for "/" som sin ASCII-kode tilsvarende (% 47%), da det lengre URL-adressen betydelig. To hovedløsninger har steget for å bekjempe dette problemet. Den ene er en URL-sikker variant av Base64 som erstatter henholdsvis + og / med - og _. Det fjerner også spesifikasjonen for å legge til = tegn for polstring. Det andre alternativet er å gå til en Base62-koding, som beholder nesten alle fordelene ved Base64 og fjerner + og /. Base62-koding er imidlertid ikke så lett anvendelig som en binær overførings-erstatning, og er derfor langt mindre populær.


Konklusjon

Det bryter det opp! Nå har du en grunnleggende kunnskap om basissystemer, spesielt når de gjelder kodingen av binære data. Hvilke andre typer webapplikasjoner vil du finne bruker for disse kodene?