Skip to content

Gagnakóðun

Í fyrri kafla skoðuðum við hvernig kóðun er notuð til að ákveða hvaða tölur (bæti) eiga að tákna hvaða bókstafi á skjánum.

En gögn eru ekki bara textagögn. Gögn á borð við myndir, tónlist og forritaskrár eru yfirleitt ekki geymd sem texti. Í þessum kafla ætlum við að skoða hvernig við framsetjum, pökkum inn og umbreytum ólíkum gögnum.

Litir

Byrjum á sýnilegum gögnum, litum. Skjárinn sem þú ert að horfa á er samsettur úr milljónum lítilla ljósapunkta sem við köllum díla (e. pixel). Hver og einn punktur getur sýnt mismunandi blöndu af þremur grunnlitum, þ.e. rauðum, grænum og bláum sem oft er táknað með skammstöfuninni RGB (e. Red, Green, Blue).

Vissir þú?

Enska orðið „pixel“ (díll) er stytting á ensku orðunum „picture element“. Upphaflega var það stytt í „pix-el“ og síðar einfaldlega í „pixel“.

Við vitum að ef við blöndum tveimur litum, t.d. málningu, saman endum við með nýjan lit. Til dæmis, ef við blöndum rauðum og grænum saman í tiltölulega jöfnum hlutföllum endum við með gulan. Það nákvæmlega sama gildir um díla. Með því að blanda saman mismunandi styrkleika á rauða, græna og bláa ljósinu, getur díllinn sýnt hvaða lit sem er.

Til að tölvan viti nákvæmlega hvaða lit hún á að sýna á díl þarf hún þannig að fá þrjár tölur sem tákna styrk hvers grunnlitar í dílnum. Ein leið til að tákna það er með prósentum. 100% styrkur á rauðum, 0% á grænum og bláum myndi þá birta rauðan . Sum kerfi nota þennan rithátt til að tákna liti, og er þá framsetningin oftast sett fram sem þrennd (100%, 0%, 0%) eða einfaldlega (100, 0, 0). Eins og í flestum framsetningum lita, þá er röðin ávallt rauður, grænn og blár (RGB).

Ef við einskorðum okkur við heilar prósentur, þá getum við sett fram \(100 \cdot 100 \cdot 100 = 1.000.000\) ólíka liti á þessu formi. Þó að mannsaugað nái að nema liti mjög vel, á það erfitt með að greina mun á svo mörgum litum. Sérð þú, til dæmis, muninn á (100%, 100%, 0%) og (100%, 100%, 1%) ?

Algengasti og útbreiddasti ritháttur notast þess vegna við eitt bæti (8 bita) til að tákna styrkleika hvers grunnlitar. Hver litur er þannig táknaður með gildi frá 0 upp í 255.

  • 0 þýðir að slökkt sé á ljósinu.
  • 255 þýðir að kveikt sé á ljósinu á fullum styrk.

Að hækka bæti um einn hefur þannig í för með sér styrkleikaaukning upp á u.þ.b. 0,4%.

Ef við viljum sýna hreinan rauðan lit, þá setjum við styrkleika rauðs í hámark (255), en höfum engan styrkleika á hinum og endum með RGB(255, 0, 0) . Til að fá dekkri rauðan, getum við helmingað styrkleika rauðs RGB(123, 0, 0) (minni styrkleiki þýðir minna ljós og þannig dekkri litur). Til að fá fjólubláan getum við blandað rauðum og bláum RGB(255, 0, 255) .

Eins og við skoðuðum í talnakerfiskaflanum getum við táknað bæti í sextándakerfinu sem tvo stafi. Algengasti og útbreiddasti ritháttur RGB gilda er einmitt að skrifa bætin þrjú sem sextándakerfistölu með myllumerki fyrir framan. Rauður er þannig #FF0000 .

Hér eru nokkur dæmi um þessa þrjá rithætti litakerfisins

Lýsing Prósentur Tugakerfi Hex-kóði
Hvítur (öll ljós í botni) 100, 100, 100 255, 255, 255 #FFFFFF
Svartur (öll ljós slökkt) 0, 0, 0 0, 0, 0 #000000
Appelsínugulur 100, 65, 0 255, 165, 0 #FFA500
Bleikur 100, 8, 58 255, 20, 147 #FF1493
Ljós blágrænn 75, 100, 93 192, 255, 238 #C0FFEE

Dæmi: Að finna Hex lit

Hvernig lítur liturinn #00FF00 út á skjá og af hverju?

Lausn

Við munum röðina, rauður, grænn og blár. Rauður og blár hafa báðir gildin 00, þ.e. 0, sem þýðir að styrkur þeirra er enginn. Gildi græns er FF (255) sem þýðir að gildi hans er á hámarki. Liturinn #00FF00 er því grænn.

Gegnsæi: Alfa-rásin (RGBA)

Í myndvinnslu og hönnun er oft hentugt að geta haft liti gegnsæa að einhverju leyti. Ein leið til að setja fram gagnsæa liti er svokallað RGBA kerfi, þar sem A-ið stendur fyrir alfa (e. alpha).

RGBA kóði er í rauninni RGB kóði að viðbættu einu bæti, sem við köllum alfa-gildi. Alfa-gildið stjórnar gegnsæi (e. transparency) litarins, þar sem 0 táknar að liturinn sé alveg gegnsær (eins og gler) en 255 táknar að liturinn sé alveg ógengsær.

Í hex-rithætti bætum við þá tveimur aukastöfum aftan við hefðbundna RGB kóðann, þannig að hann verður átta stafir í stað sex (#RRGGBBAA).

  • Ógegnsær rauður: #FF0000FF
  • 50% ógegnsær rauður: #FF000080
  • 10% ógegnsær (90% gegnsær) rauður: #FF00001A

PPM

Nú þegar við kunnum að lýsa litum, hvernig búum við til heila mynd? Í raun er stafræn mynd ekki neitt annað en risastór tafla af svona litakóðum, þar sem litapunktur í töflunni endurspeglar einn díl myndarinnar.

Ein einfaldasta leið til framsetningar mynda er staðall sem kallast PPM (Portable Pixmap). PPM mynd samanstendur af stuttum haus (e. header) sem geymir lýsigögn (e. metadata) um myndina, og svo löngum lista af RGB tugakerfistölum.

Hér er PPM kóðun á lítilli 3x4 díla mynd (12 dílar alls).

P3
3 4
255
  0   0 255   0 255   0 255   0   0
  0 255 255 255   0 255   0 255 255
  0   0   0 127 127 127 255 255 255
  0 127 255 127 255   0 255   0 127

PPM staðallinn er mjög einfaldur. Fyrstu þrjár línurnar eru haus skjalsins sem geymir lýsigögn um myndina, þ.e. gögn sem lýsa eiginleikum myndarinnar.

Lína 1
P3 - Þetta er svokölluð „töfratala“ eða skráarauðkenni (e. magic number eða file signature) sem lætur vita að gögnin sem koma í framhaldið sé PPM kóðuð mynd (í textaformi).
Lína 2
3 4 - Þetta talnapar segir til um stærð myndarinnar, þ.e. að hún er 3 dílar á breidd og 4 á hæð.
Lína 3
255 - Þessi staðall leyfir okkur að stilla hámarksgildi lita. Í okkar tilfelli höfum við valið 255 (eitt bæti) sem hármarksgildi lita, sem þýðir að litir samsvara hefðbundnum RGB gildum. Staðallinn leyfir okkur að velja hvaða tölu sem er sem hámarkstölu, en þá taka gildi litanna mið að hámarkgsgildinu. Ef við veljum hámargsgildi sem 10, þá er rauður táknaður sem 10, 0, 0 og hvítur sem 10, 10, 10.
Lína 4-15
Litakóðar díla myndarinnar, þar sem hver litur er táknaður með þremur tölum, þ.e. blár, hvítur, hvítur og rauður. Af því að við völdum hámarksgildi litakóðanna sem 255, þá eru gildin RGB litakóðar.

Skoða í CyberChef

Athugið

Varfrar styðja ekki PPM myndir og get því ekki birt þær beint. Í CyberChef þurfum við þess vegna að nota aðgerðina PPM To BMP til að breyta PPM myndinni á staðal sem kallast Bitmap, sem vafrar styðja. Í kjölfarið getum svo notað Render Image aðgerðina til að birta myndina.

Athugum líka að þar sem myndin samanstendur aðeins af 12 dílum, þá er hún pínulítil.

Dæmi

Hvað hefur þessi PPM mynd að sýna?

P3
14 12
255
  2  82 156   2  82 156   2  82 156   2  82 156 255 255 255 220  30  53 220  30  53 255 255 255   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156 
  2  82 156   2  82 156   2  82 156   2  82 156 255 255 255 220  30  53 220  30  53 255 255 255   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156 
  2  82 156   2  82 156   2  82 156   2  82 156 255 255 255 220  30  53 220  30  53 255 255 255   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156 
  2  82 156   2  82 156   2  82 156   2  82 156 255 255 255 220  30  53 220  30  53 255 255 255   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 220  30  53 220  30  53 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 
220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 220  30  53 
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 220  30  53 220  30  53 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
  2  82 156   2  82 156   2  82 156   2  82 156 255 255 255 220  30  53 220  30  53 255 255 255   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156 
  2  82 156   2  82 156   2  82 156   2  82 156 255 255 255 220  30  53 220  30  53 255 255 255   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156 
  2  82 156   2  82 156   2  82 156   2  82 156 255 255 255 220  30  53 220  30  53 255 255 255   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156 
  2  82 156   2  82 156   2  82 156   2  82 156 255 255 255 220  30  53 220  30  53 255 255 255   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156   2  82 156 
Lausn

Notum PPM To BMP aðgerðina og svo Render Image í kjölfarið.

Lausn

Myndir sem þú tekur með símanum eða birtast á vefsíðum notast ekki við PPM kóðun enda er hún mjög plássfrek. Til dæmis myndi 12 MP mynd tekin með nútímasnjallsíma vera u.þ.b. 150 megabæti ef hún væri geymd með þessari PPM kóðun. Þess í stað er notast við snið eins og JPG eða PNG sem heldur ekki bara utan um litina, heldur fela einnig í sér þjöppun (e. compression) til að minnka stærðina enn frekar.

Tvíundaútgáfa

Ef við rýnum kóðunina á myndinni hér að ofan aðeins betur, sjáum við að hún felur í sér mikla „sóun“ á plássi. Við getum þurft allt að 13 bæti til að tákna hvern díl, þ.e. þrjá tölustafi fyrir hvern litaþátt auk fjögurra bila. Hver díll myndarinnar er þannig táknaður með 13 bætum. Við vitum, aftur á móti, að við getum táknað RGB liti með 3 bætum.

PPM staðallinn skilgreinir þess vegna tvær kóðanir. Sú sem við fórum yfir að ofan kallast textabyggð PPM (e. plain PPM) en upprunalega PPM kóðunin notast við bætakóðun lita.

Þetta er fyrsta kóðunin sem við kynnumst sem er ekki byggð á textaformi (e. plaintext). Slík gögn köllum við tvíundagögn (e. binary data). Þegar við setjum fram gögn sem eiga að innhalda ákveðin bæti munum við notast við lausnarrunur (e. escape sequences) sem hafa ritháttinn \xYY, þar sem YY er gildi bætisins í sextándakerfinu. Þannig \x00 (einnig táknað sem \0) er bætið 0, \x0a er bætið 10 og \xff er bætið 255.

Athugið

Þó að textaframsetningin á þessum bætum sé nokrir stafir (og þannig nokkur bæti eins og þau eru skrifuð á skjánum), þá verðum við að hafa það hugfast að þessi framsetning táknar bara eitt bæti. Þetta er munurinn á kóðun og það sem stundum er kallað hrá gögn eða hrá bæti.

Strengurinn 68 61 6c 6c 6f er tíu bæta sextándakerfiskóðun á strengnum hallo, á meðan \x68\x61\x6c\x6f er strengurinn sem inniheldur nákvæmlega þessi fimm bæti (og er í rauninni nákvæmlega það sama og strengurinn hallo, að því gefnu að hann sé kóðaður ASCII, UTF-8 eða sambærilegri kóðun).

Þetta kann að hljóma ruglingslega og það er alveg eðlilegt að skilja ekki nákvæmlega muninn á þessum tímapunkti, en við munum kynnast þessum hugtökum betur seinna.

Mynd sem kóðuð er með tvíunda-PPM staðlinum lítur þá þannig út.

  1. Skráarauðkennið P6.
  2. Breidd, hæð og hæsta litagildi sem tugakerfistölur kóðaðar sem ASCII stafir. Bil er á milli allra gildanna. Hæsta litagildi þarf að vera stærra en 0 og minna en 65.536 (\(2^{16}\), þ.e. tvö bæti).
  3. Nákvæmlega eitt bil (yfirleitt ný lína).
  4. Fjöldi raða sem samsvarar hæð myndarinnar, raðaðar frá toppi til botns. Hver röð inniheldur fjölda pixla sem samsvarar breidd myndarinnar, raðað frá vinstri til hægri. Hver díll samanstendur af þrennd sem táknar styrk rauðs, græns og blás, í þeirri röð. Hver styrkur er táknaður sem tvíundagildi í annað hvort einu eða tveimur bætum. Ef hæsta litagildið er minna en 256, þá er notast við eitt bæti, annars tvö. Notast er við háendaframsetningu.

Vissir þú?

Sextándakerfið hefur stundum verið notað til að búta til skemmtileg orð, sér í lagi í töfratölum. Til dæmis byrja allar Java .class skrár á bætarununni \xCA\xFE\xBA\xBE (cafebabe).

Myndin sem við sáum áðan væri þannig kóðuð á eftirfarandi máta með PPM

P6
3 4
255
\x00\x00\xff\x00\xff\x00\xff\x00\x00\x00\xff\xff\xff\x00\xff\x00\xff\xff\x00\x00\x00\x7f\x7f\x7f\xff\xff\xff\x00\x7f\xff\x7f\xff\x00\xff\x00\x7f

Skoða í CyberChef

Athugið

Til að fá CyberChef til að túlka lausnarrunur sem hrá bæti þurfum við að nota aðgerðina Unescape string.

Dæmi

Hvað hefur þessi PPM mynd að sýna?

P6
14 12
255
\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\xff\xff\xff\xdc\x1e\x35\xdc\x1e\x35\xff\xff\xff\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c\x02\x52\x9c
Lausn

Notum fyrst Unescape string aðgerðina, svo PPM To BMP og loks Render Image.

Lausn

Tvíundagögn

Eitt stærsta vandamálið við gagnaflutning í árdaga tölvupóstsins var að senda hrá gögn (t.d. skrár eða forrit) í gegnum kerfi sem gátu einungis lesið texta. Til að leysa þetta þurfti að finna leið til að „pakka inn“ tvíundagögnum þannig að hægt væri að skrifa þau með ASCII stöfum. Þannig kóðun kallast textakóðun á tvíundagögnum (e. binary-to-text encoding).

Sextándakerfiskóðun

Við höfum nú þegar séð eina leið til að kóða tvíundagögn sem textastrengi (e. hex encoding), en það er einfaldlega með því að rita bætin í sextándakerfinu. Til að spara pláss er hægt að sleppa bilunum á milli bætanna, því við vitum að hvert bæti er nákvæmlega tveir bók- eða tölustafir.

Dæmi

Hvað hefur þessi hex kóðaði strengur að geyma?

50360a31382031340a3235350affffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000005574358fb15e8fb15e8fb15e8fb15e557435000000ffffffffffffffffffffffffffffff0000000000000000000000000000005574358fb15e8fb15e8fb15e8fb15e8fb15e8fb15e5574350000000000000000000000000000000000005574358fb15e8fb15e8fb15e8fb15effffff0000008fb15e8fb15effffff0000008fb15e8fb15e8fb15e8fb15e557435000000ffffff000000e1b7bfe1b7bfe1b7bf8fb15e0000000000008fb15e8fb15e0000000000008fb15ee1b7bfe1b7bfe1b7bf000000ffffffffffffffffff000000e1b7bfe1b7bf8fb15e8fb15e8fb15e8fb15e8fb15e8fb15e8fb15e8fb15ee1b7bfe1b7bf000000ffffffffffffffffffffffffffffff000000f0e9bef0e9bef0e9bef0e9bef0e9bef0e9bef0e9bef0e9bef0e9bef0e9be000000ffffffffffffffffffffffffffffffffffff000000f0e9bef0e9bef0e9bef0e9bef0e9bef0e9bef0e9bef0e9bef0e9bef0e9be000000ffffffffffffffffffffffffffffffffffffffffff000000663d24663d24663d24663d24f0e9be663d24663d24663d24000000ffffffffffffffffffffffffffffffffffffffffffffffff000000663d24663d24663d24663d24f0e9be663d24663d24663d24000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff000000663d24663d24663d24f0e9be663d24663d24000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000663d24663d24f0e9bef0e9be663d24663d24000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000663d24663d24f0e9be663d24663d24663d24000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffff0a
Lausn

Notum fyrst From Hex aðgerðina til að sjá hvaða gögn leynast í þessum kóðaða streng.

Sjá skref

Við sjáum þá skráarauðkennið P6 sem bendir til þess að um sé að ræða PPM mynd í tvíundaformi. Við prófum þá að beita PPM To BMP og Render Image aðgerðunum og sjáum þá þessa ljómandi fínu mynd.

Lausn

Þessi kóðun sparar vissulega pláss í samanburði við lausnarrunur, en við erum samt ekki að nýta plássið mjög vel. Við sjáum að kóðuðu gögnin eru alltaf tvöfallt stærri en þau upprunalegu. Þ.e. til að kóða \(n\) bæti þurfum við \(2 \cdot n\) bæti.

Ástæða þess er að, af þeim rúmlega 90 hefðbundnu textatáknum (þ.e. bók- og tölustafir og greinamerki) sem ASCII hefur upp á að bjóða notar sextándakerfiskóðun aðeins 16. Við getum vissulega gert betur en það.

Base64

Langalmennasta textakóðun á tvíundagögnum er Base64. Eins og nafnið gefur til kynna notar Base64 grunntöluna 64 til að tákna tvíundagögnin með 64 táknum, þ.e.

  • Hástöfum A-Z sem tákna 0-25 (26 stafir)
  • Lágstöfum a-z sem tákna 26-51 (26 stafir)
  • Tölustöfum 0-9 sem tákna 52-61 (10 stafir)
  • + og / sem tákna 62 og 63

Aukatáknin

Í sumum kringumstæðum, sem við fáum að kynnast seinna, er óhentugt að notast við táknin + og /. Í þeim tilfellum eru t.d. - og _ notuð í staðinn (URL-safe Base64), en önnur tákn hafa líka verið notuð af mismunandi kerfum.

Grunntalan 64 varð fyrir valinu þar sem hún er veldi af tveimur, þ.e. \(2^6 = 64\), sem þýðir að við getum úthlutað einu tákni til allra sex bita tvíundatalna. En hvernig hjálpar það við kóðun bæta sem eru 8 bitar, ekki 6? Við leysum það með því að skipta gögnunum sem við kóðum í þriggja bæta hópa (3 bæti × 8 bitar = 24 bitar). Við klippum svo þessa 24 bita niður í fjóra 6 bita hópa. Hver 6 bita hópur samsvarar þá einum af 64 stöfunum. Útkoman er sú að 3 bæti af hrágögnum verða að 4 bætum af texta. Kóðuðu gögnin eru þannig aðeins 33% stærri en þau upprunalegu, sem er töluvert betra en sextándakerfiskóðun býður upp á.

Kóðum strenginn Vit með Base64 sem dæmi.

Strengur:        V        i        t
Sextándakerfi:   5   6    6   9    7   4
Átta bita hópar: 01010110 01101001 01110100
Sex bita hópar:  010101 100110 100101 110100
Tugakerfistala:  21     38     37     52
Base64:          V      m      l      0

Við byrjum á því að kóða strenginn sem ASCII streng, þ.e. finna táknanna í sextándakerfinu. Við breytum þeim svo yfir í tvíundakerfið og endum með þrjá hópa af átta bita tölum. Við skiptum þá þeirri runu niður í sex bita hópa og breytum þeim í tugakerfistölu. Við finnum svo hvaða tölustafir í Base64 samsvara þeim tugakerfistölum og endum þannig með Base64 kóðaðan streng.

Eðlilegt er þá að velta fyrir sér hvað gerist ef fjöldi bæta í þeim gögnum sem við kóðum er ekki deilanlegur með þremur, þ.e. við endum með eitt eða tvö bæti í síðasta hópnum. Í þeim tilfellum er 0 bætt fyrir aftan gögnin sem kóða á, þangað til fjöldi bæta er deilanlegur með 3 (ýmist tvö eða fjögur núll). Þessi aðgerð kallast fylling (e. padding). Fylltu (e. padded) gögnin er svo kóðuð, en til að merkja að upprunalegu gögnin hafi verið fyllt, er = eða == skeytt aftan á strenginn til að tákna að fjarlægja þurfi ýmist tvö eða fjögur núll af strengnum þegar hann er afkóðaður.

Hér að sjáum við Base64 kóðun á strengnum B.

Strengur:        B
Sextándakerfi:   4   2 
Átta bita hópar: 01000010
Sex bita hópar:  010000 100000
                          ^^^^
                          Fylling
Tugakerfistala:  16     16
Base64:          Q      Q     ==
                              ^^
                              Fylling með fjórum 0

Til að ná upp í tvo hópa af 6 bitum, fyllum við upprunalega strenginn með fjórum núllum. Base64 kóðunin endar því sem QQ==.

Að lokum sjáum við svo Base64 kóðun strengsins FB.

Strengur:        F        B
Sextándakerfi:   4   6    4   2 
Átta bita hópar: 01000110 01000010  
Sex bita hópar:  010001 100100 001000
                                   ^^
                                   Fylling
Tugakerfistala:  17     36
Base64:          R      k     I    =
                                   ^
                                   Fylling með tveimur 0

Til að ná upp í þrjá hópa af 6 bitum, fyllum við upprunalega strenginn með tveimur núllum. Base64 kóðunin endar því sem RkI=.

Að bera kennsl á Base64

Base64 er notað mjög víða enn í dag. Að sjá strengi sem lítur út eins og handahófskennd blanda af hástöfum, lágstöfum og tölustöfum með / og + eru sterk merki þess að um sé að ræða Base64 kóðaðan streng. Jafnvel sterkari vísbending er að sjá slíkan streng sem endar á =.

Dæmi

Hvaða upplýsingar leynast í skilaboðunum U3ZvbmEgZXIgaMOmZ3QgYcOwIHNlbmRhIMOtc2xlbnNrYSBzdGFmaSBvZyDwn5iKIG1lw7AgQVNDSUkg8J+OiQ==

Lausn

Beitum aðgerðinni From Base64 og endum með svarið.

Skoða í CyberChef

En við getum, auðvitað, kóðað meira en bara texta með Base64.

Dæmi

Hvað leynist hér?

UDYKMjQgMzIKMjU1Cv///////////////////////////////wAAAAAAAP///////////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAP///////////////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAP///////////////////////////////////////////////////////////////////////////////wAAAAAAAP+fDwAAAP///////////////////////////////////////////////////////////////////////////wAAAPrYCfrYCf+fDwAAAP///////////////////////////////////////////////////////////////////////////wAAAPrYCf+fDwAAAAAAAP///////////////////////////////////////////////////////////////////////////wAAAPrYCf+fDwAAAP///////////////////////////////////////////////////////////////////////////wAAAPrYCfrYCf+fDwAAAP///////////////////////////////////////////////////////////////////////////wAAAPrYCf+fDwAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////////////////////////wAAAPrYCfrYCf+fD/+fD/+fD/+fD/+fD/+fDwAAAAAAAP///////////////////////////////////////////////wAAAPrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCf+fD/+fDwAAAP///////////////////////////////////////wAAAP+fD/rYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCf+fDwAAAAAAAP///////////////////////////////wAAAP+fD/rYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCQAAAAAAAP///////////////////wAAAP+fD/rYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCf+fD/+fD/rYCfrYCfrYCfrYCQAAAAAAAP///////////wAAAP+fD/rYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCf+fDwAAAP+fD/+fD/+fD/+fDwAAAAAAAAAAAAAAAP///wAAAP+fD/rYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCfrYCf+fDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAP+fD////wAAAPrYCfrYCfrYCfrYCfrYCf///wAAAPrYCfrYCfrYCf+fDwAAAP///////////////////////////////wAAAP+fDwAAAAAAAPrYCfrYCfrYCfrYCfrYCf///wAAAAAAAPrYCfrYCf+fDwAAAP///////////////////////////wAAAP43Xv43XgAAAAAAAPrYCfrYCfrYCfrYCfrYCQAAAAAAAAAAAPrYCfrYCf+fDwAAAP///////////////////////////wAAAP43Xv43Xv43XvrYCfrYCQAAAPrYCfrYCfrYCQAAAAAAAAAAAP43XvrYCf+fDwAAAP///////////////////////////wAAAP43Xv43Xv43XvrYCfrYCfrYCfrYCfrYCfrYCfrYCf43Xv43Xv43Xv43Xv+fDwAAAAAAAAAAAAAAAAAAAAAAAP///////////wAAAP43XvrYCfrYCfrYCQAAAPrYCfrYCfrYCfrYCf43Xv43Xv43Xv43XgAAAPrYCfrYCfrYCfrYCfrYCQAAAP///////////////wAAAAAAAPrYCfrYCfrYCfrYCQAAAAAAAAAAAP43Xv43XgAAAAAAAP+fD/rYCfrYCfrYCfrYCfrYCQAAAP///////////wAAAP+fD/rYCfrYCfrYCfrYCQAAAP43Xv43Xv43XgAAAAAAAPrYCfrYCQAAAP+fD/rYCQAAAAAAAAAAAP///////////wAAAPrYCfrYCfrYCfrYCfrYCQAAAP43Xv43XgAAAP43XgAAAPrYCfrYCfrYCQAAAP+fD/+fDwAAAP///////////////////wAAAPrYCQAAAPrYCfrYCfrYCQAAAAAAAAAAAP///wAAAAAAAAAAAAAAAPrYCf+fDwAAAAAAAP///////////////////////////wAAAP+fD/rYCfrYCfrYCQAAAP///////wAAAP///////wAAAPrYCfrYCf+fDwAAAAAAAP///////////////////////////wAAAP+fD/rYCfrYCfrYCfrYCQAAAP///////////wAAAPrYCfrYCf+fDwAAAAAAAP///////////////////////////////////wAAAP+fD/rYCQAAAPrYCfrYCQAAAAAAAAAAAPrYCfrYCf+fDwAAAP+fDwAAAP///////////////////////////////////wAAAP+fDwAAAP+fDwAAAPrYCfrYCfrYCf+fD/+fD/+fDwAAAP+fD/+fDwAAAP///////////////////////////////////////wAAAP+fD/+fDwAAAP+fD/+fD/+fDwAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////////////////////wo=
Lausn

Beitum fyrst aðgerðinni From Base64 og skoðum niðurstöðuna.

Sjá skref

Hér sjáum við að úttakið byrjar á P6, sem er skráarauðkenni PPM skráa. Við beitum þá PPM To BMP og Render Image aðgerðunum og endum með svarið.

Skoða í CyberChef

Aðrir grunnar

Til eru fleiri kóðanir sem notast við aðrar grunntölur sem ekki hafa náð jafn mikilli fótfestu.

Base32

Base32 notar grunntöluna 32 og þannig aðeins 32 tákn, oft hástafina A-Z og tölurnar 2-7. Einn kostur Base32 er sá að við þurfum ekki að gera greinarmun á há- og lágstöfum, þ.e. það skiptir ekki máli hvort við skrifum A eða a.

Base85
Base85, einnig þekkt sem sem Ascii85, notast við grunntöluna 85 og notar öll ASCII táknin frá 0x21 upp í 0x75 (alla hástafina, alla tölustafina, nánast alla lágstafina og nánast öll greinamerkin).