Basis Wat? Een praktische inleiding tot bascodering

Al op jonge leeftijd leren we op onze vingers te rekenen - beginnend met 1-5, dan 1-10, en misschien, als je als peuter vooral ondernemend bent, zul je leren tellen tot 20, 30 en verder . Niemand probeert ons ooit te laten weten dat we eigenlijk wat meer complexe wiskundige aannames maken; we kennen allemaal Base10, om precies te zijn.

In dit artikel beginnen we met een meer afgerond begrip van Base10 en de structuur ervan, en vervolgens bespreken we binary (Base2, de bouwstenen van computing). Eindelijk maken we het af door te praten over Base32 en Base64. In elke fase bespreken we de voordelen en het gebruik voor elk type.


Waarom Base10

We hebben 10 vingers.

Dus waarom hebben we Base10 gekozen? Het komt niet omdat de lettervormen 0-9 bestaan; dat was eigenlijk een gevolg van de keuze om Base10 te gebruiken. In feite is dit waarschijnlijk vanwege het leerproces dat we hierboven hebben beslist - we hebben 10 vingers. Dit maakt het veel eenvoudiger om het systeem te begrijpen.

Dus, laten we een beetje praten over hoe Base10 eigenlijk is gestructureerd. Dit zal de basis zijn voor begrip dat we zullen gebruiken in de daaropvolgende discussie.

Vanaf 0 tellen we tot 9 en vullen we de kolom '1's' in. Zodra de kolom vol is (heeft 9), is dat het maximum voor de kolom. Dus gaan we naar de volgende kolom (aan de linkerkant) en beginnen bij 1. In alle opzichten kunnen we stellen dat er een oneindig aantal voorloopnullen zijn vóór onze eerste significante kolom. Met andere woorden, "000008" is hetzelfde als "8". Dus als elke kolom volloopt, wordt de volgende kolom met één verhoogd en beginnen we terug bij de vorige kolom om hem weer op dezelfde manier op te vullen als eerder. In het bijzonder neemt de 1s-kolom toe van 0-9, en vervolgens wordt een andere tien toegevoegd aan de tientallen-kolom. Dit wordt voortgezet, en als de tient-kolom op 9 staat en de 1s-kolom op 9 staat, wordt 1 toegevoegd aan de 100-kolom, enzovoort. We kennen allemaal dit stukje van de pizzle.

Beschouw het nummer 1020. Te beginnen vanaf de rechterkant kunnen we dit als "0 * 1 + 2 * 10 + 0 * 100 + 1 * 1000" begrijpen. Beschouw nu het nummer 5.378. We kunnen dit als "8 * 1 + 7 * 10 + 3 * 100 + 5 * 1000" begrijpen. Een gegeneraliseerde functie om Base10 te begrijpen, is als volgt:

(10 verhoogd naar de macht van de kolom van rechts -1) * (het getal gevonden in de kolom)

Daarom, als er een 6 in de 5e kolom van rechts is, 10 ^ 4 * 6 = 60.000.

We kunnen zien dat dit een generaliseerbare formule is om alle basissystemen te begrijpen.


Base2 (binair)

Dit is de reden waarom deze systemen worden aangeduid als Base (N).

Het volgende systeem waar we het over hebben is Base2, of binair. Binary bestaat uit twee cijfers, 0 en 1. Dit leent zich om vele redenen goed voor computers, vooral omdat computers afhankelijk zijn van switches met twee toestanden: aan of uit. Binair is het meest basale systeem dat nodig is voor alle logische bewerkingen (denk "waar" en "onwaar").

Dus, hoe werkt binair werk? Neem de formule van boven, en gebruik er twee in plaats van tien. En op die opmerking, dit is de reden waarom deze systemen worden aangeduid als Base (N).

(2 verhoogd naar de macht van de kolom van rechts -1) * (het getal gevonden in de kolom)

Laten we het willekeurige nummer 1001101 nemen in binair getal en deze formule toepassen.

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

"Wacht!", Denk je. "Als binair alles is waar computers van gemaakt zijn, hoe zou u dan brieven in binair bestand schrijven?" Goede vraag. Dit brengt ons eigenlijk bij onze introductie van Base16.


Base16

Het zou in plaats daarvan een uit tien cijfers bestaande weergave van 10 zijn.

Laten we ons even voorstellen dat we 11 vingers hadden. We zouden natuurlijk een systeem van Base11 gebruiken. Afgezien daarvan lijkt het momenteel ongemakkelijk moeilijk voorstelbaar te zijn, welke andere implicaties zou dit hebben? Misschien is de belangrijkste implicatie dat we in de jaren '50 een extra toename van meer dan 9 zouden hebben gehad. Maar het zou geen "10" zijn, omdat 10 niet beperkt is tot de jaren '50 kolom. Het zou in plaats daarvan een uit tien cijfers bestaande weergave van tien zijn. En in feite is dat precies hoe letters functioneren in basissystemen voorbij Base10 tot Base62, met enkele kanttekeningen (die we later zullen bespreken als we over Base32 praten).

Laten we ons voorstellen Base11 te gebruiken, maar een hoofdletter A te vervangen voor de eencijferige "10" die we hierboven hebben besproken. Hoe zouden we het nummer 54 schrijven??

Omdat we weten dat de eerste kolom van links de kolom '11's' is, zouden we beginnen met 54 te delen door elf, wat ons 4 geeft met een rest van 10. Als 'A' 10 vertegenwoordigt, zou in nummer 11 het getal 54 worden weergegeven als 4A.

Laten we dat in omgekeerde volgorde doen, met de formule die we eerder hebben gebruikt.

(11 verhoogd naar de macht van de kolom van rechts - 1) * (het getal gevonden in de kolom)

In dit geval zou dat betekenen:

(1 * A) + (4 * 11)

Vervang nu 10 voor A:

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

Hexadecimaal

Hoe is dit nuttig, vraag je je af? Base11 hoeft niet noodzakelijk bruikbaar te zijn (tenzij u een gegevensstructuur hebt die baat zou hebben bij een Base11-systeem). Base16 wordt echter overal in computersystemen voor meerdere doeleinden gebruikt. Ook bekend als hexadecimaal gebruikt Base16 de cijfers 0-9 gevolgd door de letters a-f (niet hoofdlettergevoelig). In het bijzonder ziet u hexadecimalen die worden gebruikt om RGB-kleuren te definiëren in CSS (en in de meeste kleurenkiezer-widgets op desktopsoftware), met twee cijfers voor elk van de kanalen rood, groen en blauw.

Dus bijvoorbeeld, # A79104 zou produceren r = A7, g = 91, b = 04. In decimalen zou dit hetzelfde zijn als r = 167, g = 145, b = 4; de resulterende kleur zou een goudgeel zijn. Twee hexadecimale cijfers samen kunnen 256 verschillende nummers vertegenwoordigen, en dus zijn er 256 ^ 3 (16.777.216) mogelijke cijfercombinaties in het RGB hexadecimale systeem, vertegenwoordigd door slechts 6 tekens (of 3 als u de snelkoppelingsmethode gebruikt, waarbij elk van drie cijfers is impliciet verdubbeld;. # 37d == # 3377dd).

Base16 wordt vaak gebruikt in assembleertalen, wat de laagst toegankelijke programmeertaal is. Omdat hexadecimalen eenvoudig in binaire bestanden kunnen worden omgezet, zijn ze een gemakkelijkere manier om instructies voor de assemblagecode te schrijven.

Notitie: Hetzelfde geldt in het algemeen voor de populariteit van Base32 en Base64; deze coderingen worden gebruikt omdat ze van nature beter zijn voor binaire gegevens (omdat ze machten van 2 zijn), en omdat er op ten minste 64 veilige personages (en er zijn geen 128 veilige tekens) zijn op bijna elke computer.

Neem voor een hexadecimaal voorbeeld het nummer 1100 in hexadecimaal, wat overeenkomt met 4352 in decimalen. Hetzelfde getal in het binaire getal is 0001 0001 0000 0000. Het converteren van hexadecimaal naar binair is een eenvoudige bewerking van het gebruik van een omzettingstabel, waarbij 0 in hexadecimaal 0000 is in binair getal en F in hexadecimaal is 1111 in binair getal.

Merk op dat de 0's links van het eerste cijfer aangeven dat het binaire getal in bits is, waarbij de 0's helemaal links lege kolommen zijn. Fundamenteel zijn deze niet nodig; u zult echter bijna uitsluitend op deze manier geschreven binaire tekens tegenkomen. Deze praktijk wordt opvulling genoemd en wordt toegepast omdat de lengte van de gegevens onbekend is en daardoor problemen zou kunnen veroorzaken als er meerdere gegevens worden verzonden; door het opvullen van de laatste reeks, is de gegevensgrootte gegarandeerd, bijvoorbeeld 4 bits lang (voor binair). Opvulling komt ook voor in andere vaak gebruikte en specificatie-gebaseerde coderingsschema's; in het bijzonder gebruiken Base32 en Base64 het gelijkteken ("=") voor opvulling.


Base32

Men zou kunnen veronderstellen dat Base32 de nummers 0-9 en vervolgens de eerste 22 letters van het alfabet is (tot V).

Weet je nog toen we de waarschuwing hierboven vermeldden? Dit is de waarschuwing: de meest geaccepteerde Base32-definitie is eigenlijk een codering die begint met de eerste 26 letters van het alfabet en eindigt met de cijfers 2-7. Dit is gedefinieerd in Het Request for Comments (RCFC) 4648 van de Internet Engineering Task Force, die ook Base16 en Base64 definieert. Let op, het verschil is dat de codering voor 0 A is, niet 0. Om een ​​string in Base32 te coderen, gebeuren de volgende instructies.

Eerst wordt de te coderen string gesplitst in blokken van 5 bytes (40 bits in binair). Letters worden weergegeven in 8-bitsblokken in ASCII (de standaard voor computers), dus voor elke 5 letters zijn er 40 bits. (Deze 8-bits definitie voor elke letter staat in ASCII in totaal 255 tekens toe.)

Verdeel deze 40 bits vervolgens in 8 vijf-bits blokken; dus, voor elke 5 letters, zijn er 8 blokken om te coderen in base32. Wijs elk van deze blokken toe aan een 5-bits tekentoewijzing in het Base32-alfabet. Als het vijf-bitsblok bijvoorbeeld 00010 (of decimaal 2) is, is het toegewezen teken de letter, c. Als het vijfbitblok 01010 (decimaal 10) is, is het toegewezen teken de letter K.

Laten we deze stappen toepassen op de string "yessir".

Karakter ASCII decimaal 8-bit ASCII-binair
Y 89 01111001
e 101 01100101
s 115 01110011
s 115 01110011
ik 105 01101001
r 114 01110010

Laten we de binaire representaties nemen en ze nu samenvoegen, en ze in 5-bit groepen splitsen

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

Een opmerking over het bovenstaande: omdat de specificatie definieert dat de codering moet worden gedaan in delen van 8 5-bits stukjes, moeten we een pad maken met 0 als het aantal bits niet deelbaar is door 5 (vandaar de 010 (00) op de tweede regel) en met = als het aantal chunks niet deelbaar is door 8. De "null" -waarden worden vervangen door het padding-teken, "=".

Elk van deze 5-bits binaire getallen verwijst naar een teken in het 32-bits alfabet; specifiek, de uitvoer voor Ja meneer zou zijn PFSXG43JOI ======

Een vergelijkbaar proces wordt gevolgd voor Base64. Er zijn een paar fundamentele verschillen tussen Base32 en Base64. Base64 bevat de letters A-Z, a-z, cijfers 0-9 en de symbolen + en /. Zoals eerder vermeld, wordt het "=" -symbool gebruikt voor opvulling. De verschillen zijn voornamelijk dat alle letters hoofdlettergevoelig zijn en dat alle cijfers worden gebruikt (in plaats van de subset 2-7). De symbolen + en / worden ook toegevoegd.

Het Base64-coderingsproces neemt 24-bits reeksen (3 letters) en verdeelt deze in vier 6-bit-chunks, waarbij het resulterende binaire getal wordt toegewezen aan het Base64-alfabet. Dus laten we eens kijken naar ons vorige voorbeeld, de string "yessir".

 8-bit binair: 01111001 01100101 01110011 01110011 01101001 01110010 6-bit chunks: 011110 010110 010101 110011 011100 110110 100101 110010 Base64: eWVzc2ly

Er zijn een paar belangrijke dingen om op te merken. Ten eerste is Base64 hoofdlettergevoelig. Ten tweede, omdat het aantal bits (48) deelbaar was door 6, was bit-padding niet nodig. Het aantal 6-bits chunks was ook deelbaar door vier (wat ook betekent dat het aantal ingevoerde tekens deelbaar was door 3), dus er was geen null ("=") padding nodig.


Een samenvatting van Base16, Base32 en Base64

Deze binair-vriendelijke basen worden gebruikt in alle programmeerstructuren.

Deze binair-vriendelijke basen worden gebruikt in alle programmeerstructuren. Binaire gegevens worden gecodeerd in deze bases om de getrouwheid van de overdracht te waarborgen en te blokkeren tegen fouten die kunnen voortvloeien uit per ongeluk niet gecodeerde binaire gegevensoverdracht. Ze vertrouwen op op standaarden gebaseerde tekentabellen en werken alleen gegarandeerd als zowel de encoder als de decoder dezelfde tabel gebruiken; er zijn bijvoorbeeld algemeen geaccepteerde aangepaste versies van base32, waaronder een door Douglas Crockford die enkele van de aanvaardbare tekens, inclusief de letter "u", wijzigt om onopzettelijke obsceniteit te voorkomen.


Codering in de praktijk

Naast het gebruik van hexadecimale getallen op een regelmatige basis voor CSS-kleuren, worden Base32 en Base64 consistent op internet gebruikt. Hoewel het officiële coderingsproces voor Base32 en Base64 de grootte van de string doet afnemen, kunnen coderingsnummers in Base64 of Base32 zeer nuttig zijn voor dingen als URL-verkorting, waarbij een URL naar / foo / id verwijst. Beschouw de volgende decimale getallen en hun Base32- en Base64-equivalenten.

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

Zoals u kunt zien, zijn er belangrijke voordelen aan het gebruik van Base64 of Base32 voor het verkorten van het aantal. Wanneer elk teken telt, kunt u met behulp van deze basiscoderingen tekens opslaan. In veel gevallen is het gecodeerde nummer ongeveer de helft van de lengte van het niet-gecodeerde nummer.


Een opmerking over Base62 en Url-Modified Base64

Welke andere soorten webtoepassingen worden gebruikt voor deze coderingen?

Als Base64 het nummer 959 codeert, is het resultaat O /. Dit is natuurlijk geen url-veilige waarde vanwege de "/", dus een url die wijst naar O / zou niet worden gedecodeerd als O /, maar als O (wat de decimale waarde 14 is). Het zou het doel ook verslaan om de "/" als het ASCII-codelequivalent (% 47%) te coderen, omdat dit de URL aanzienlijk verlengt. Er zijn twee hoofdoplossingen om dit probleem te bestrijden. Een daarvan is een url-veilige variant van Base64 die respectievelijk de + en / met - en _ vervangt. Het verwijdert ook de specificatie van het toevoegen van = tekens voor opvulling. De andere optie is om naar een Base62-codering te gaan, die bijna alle voordelen van Base64 behoudt en de + en / verwijdert. Base62-codering is echter niet zo gemakkelijk toepasbaar als een binair transmissiesubstituut en is daarom veel minder populair.


Conclusie

Dat wikkelt het! U hebt nu een fundamentele kennis van basissystemen, vooral omdat deze van toepassing zijn op het coderen van binaire gegevens. Welke andere soorten webtoepassingen worden gebruikt voor deze coderingen?