# Basiskennis informatica/Talstelsels
## Inleiding

Afhankelijk van de situatie leent het ene talstelsel zich beter dan een ander. Bij het onderdeel talstelsels in het boek wiskunde wordt uitleg gegeven over de algemene "werking" van een talstelsel. Binnen dit boek 'basiskennis informatica' is het de bedoeling om te kijken naar waar deze talstelsels voorkomen in de computer. Het is niet de bedoeling om een volledige lijst op te stellen, maar om toch enkele belangrijke voorbeelden te behandelen.

## Binair

We weten al dat bitreeksen snel behoorlijk lang worden. Vandaar zal je eerder het decimale of hexadecimale talstelsel in gebruik zien, gezien hun compactere vorm. Toch zijn er ook situaties waarbij de binaire notatie nodig is. Dit komt oa. voor bij subnetting bij netwerken of het gebruik van een vlag. Deze vlag refereert naar een of meer bits, waaraan een betekenis gekoppeld wordt. In het geval van zaken i.v.m. netwerken (zoals TCP, IPv4 en IPv6) kan je een programma zoals Wireshark gebruiken om dit tot op binair niveau te bekijken.

### FLAGS-register

Het FLAGS-register is een register in de Intel x86 microprocessor dat de staat bevat waar de processor zich in bevindt. Dit register is 16 bits breed. Een mogelijk voorbeeld:
In dat register wordt bv. de zevende bit gebruikt voor de zero-flag: is het resultaat van een bewerking al of niet nul. In het voorbeeld staat deze vlag op 1. Merk op dat we uit de hexadecimale voorstelling, nl. 5AEB, niet onmiddellijk kunnen afleiden wat de zevende bit als waarde heeft. De binaire notatie is hier dus aangewezen.

### IPv4

In een IPv4 pakket zitten drie bits die als vlag worden gebruikt. Als je dit bekijkt via een packet sniffer merk je bv. hexadecimaal 40. Je weet dan echter nog niet hoe de vlag van drie bits eruit ziet. Binair wordt 40$_{(16)}$ 01000000. De vlag is dus 010. Daaruit kan besloten worden dat dit IP pakket niet mag gefragmenteerd worden en dat er geen verdere fragmenten komen:

## Octaal

De octale voorstelling wordt niet zoveel meer gebruikt. In de beginjaren van de computer werd het nog gebruikt om de bits per drie te groeperen. Zo kon je deze groep voorstellen door 1 octaal getal: 0=000, 1=001, 2=011, ..., 6=110, 7=111. Nu worden bits vaak gegroepeerd per 4, omdat je dit kan voorstellen als 1 hexadecimaal getal (zie verder).
De octale voorstelling wordt wel nog gebruikt bij het chmod-commando in Unix/Linux en het vertelt het systeem hoeveel toegang het moet geven t.o.v. een bestand of map. Hiervoor bestaan leesrechten (r, van read), schrijfrechten (w, van write) en uitvoerrechten (x, van execute). Dat zijn 3 soorten rechten, met dus 8 onderstaande combinaties (2$^3$), die dus als een octaal getal kunnen worden voorgesteld:
Deze rechten worden toegekend voor de eigenaar, de groep en de andere gebruikers.
Hier heeft een gebruiker linus lees- en schrijfrechten. Iedereen die behoort tot de groep leerling heeft ook lees- en schrijfrechten. Alle andere hebben enkel leesrechten.
Stel dat deze gebruiker zelf alle rechten wenst, waarbij gebruikers van de groep leerling enkel mogen lezen. Alle anderen mogen niets kunnen. Deze instelling kan dan worden voorgesteld door het octale getal 740. In combinatie met het commando chmod wordt dit dan:
Een chmod 800 zal dan niet lukken, daar dit geen octaal getal is (om 8 binair voor te stellen heb je 4 bits nodig, nl. 1000).

## Decimaal

Bij onderstaande IPv4 adressen wordt de decimale notatie gebruikt:
Toch zou het eigenlijk logischer zijn om een hexadecimale notatie te gebruiken. Zo lijkt bovenstaande decimale notatie te suggereren dat een IPv4-adres bestaat uit 4 groepen van 4 getallen, waarbij elk getal bestaat uit maximum drie cijfers. Mocht dat waar zijn, zou ook 621.85.147.12 mogelijk zijn, wat niet het geval is. Elk getal bestaat namelijk uit 8 bits, waarmee je dus enkel kan gaan tot 11111111$_{(2)}$ = 255$_{(10)}$ = 2$^8$-1. Dit maakt het theoretische "grootst" mogelijke IPv4-adres 255.255.255.255.
Een hexadecimale notatie zou dan meer voor de hand liggen, maar bij een IPv4 adres is dat niet gebruikelijk. Bovenstaande lijst - waarbij het prefix 0x is gebruikt om aan te geven dat het hexadecimale getallen zijn - wordt dan:
Het theoretische "grootst" mogelijke IPv4-adres wordt dan hexadecimaal 0xFFFFFFFF.

## Hexadecimaal

Alhoewel een computer werkt in het binaire talstelsel, is dit voor de mens niet zo handig. Zo is het decimale getal 99 binair 1100011 en telt dan 7 cijfers i.p.v. 2. Compact is anders. Als compactere voorstelling zou je denken aan het decimale talstelsel, maar dat komt niet zo netjes overeen met het binaire talstelsel, waar de bits vaak per acht gegroepeerd worden. Met 3 bits kan je 2$^3$=8 mogelijkheden maken, wat te weinig is om de 10 decimale cijfers te kunnen voorstellen. Met 4 bits kan je 2$^4$=16 mogelijkheden maken, wat teveel is voor het decimale talstelsel.
We merken wel dat 4 bits perfect dient om de 16 mogelijke hexadecimale cijfers voor te stellen (van 0000$_2$ = 0$_{16}$ tot 1111$_2$ = F$_{16}$). Elke reeks van 4 bits (een nibble) kan worden voorgesteld door één hexadecimaal symbool. Dus kan een byte altijd door twee hexadecimale cijfers voorgesteld worden. Software- en computerontwerpers werken dan ook liever met het hexadecimale talstelsel: het vergemakkelijkt de leesbaarheid en voorstelling van binaire informatie.

### IPv6

Internet Protocol versie 6 (IPv6) is de opvolger van Internet Protocol versie 4 (IPv4). IPv6 is onder andere ontwikkeld om de beperkingen en tekortkomingen van IPv4 te verhelpen. Met name het tekort aan beschikbare IP-nummers. Zo bestaan IPv4 adressen uit 32 bits, terwijl IPv6-adressen uit 128 bits bestaan. Waar bij IPv4 adressen de decimale notatie het meest gebruikelijk is, is dit bij IPv6 de hexadecimale notatie:

### Mac-adres

Het MAC-adres is een uniek identificatienummer dat aan een apparaat (bv. een netwerkadapter) in een ethernet-netwerk is toegekend. Het bestaat uit 6 bytes, waarbij de eerste 3 bytes de fabrikant aanduiden en de volgende 3 bytes uniek moeten zijn. Het bestaat dus uit 48 bits (6*8) en wordt genoteerd in hexadecimale vorm:
In dit geval duidt 00:24:1D op GIGABYTE als fabrikant.

### RGB

Het RGB-kleursysteem is een kleurcodering, een manier om een kleur uit te drukken met behulp van een combinatie van de drie primaire kleuren Rood-Groen-Blauw. De hoeveelheid van elke primaire kleur die benodigd is om de mengkleur te verkrijgen, wordt uitgedrukt in een getal dat meestal uit 8 bits bestaat en dus kan variëren tussen 00000000$_{(2)}$ en 11111111$_{(2)}$ of dus tussen 0$_{(10)}$ en 255$_{(10)}$.
In HTML en CSS kan de hexadecimale notatie gebruikt worden om HTML-kleuren voor te stellen. Zo betekent #FF0000 dan rood en #FFFF00 dan geel (namelijk als mengeling van rood en groen). Of #FFFFFF wit (alle basiskleuren op hun maximum) en #000000 zwart (geen enkel basiskleur). Of #A3A3A3 een lichtgrijs kleur en #616161 een donkergrijs kleur.
Als ook transparantie nodig is, aangegeven door het alpha-kanaal, worden vaak 8 extra bits gebruikt. Zo betekent 0x80FFFF00 een doorzichtig geel, met een alpha-kanaal van 50,2%. Want: 80$_{(16)}$=128$_{(10)}$ en 128/255=0,50196=50.2%. Dit wordt dan RGBA genoemd.

### Hexspeak

Doordat er letters voorkomen in het hexadecimale talstelsel heeft dat er programmeurs toe aangezet om creatief om te springen met hun "getallen", zeker in combinatie met leetspeak. Enkele voorbeelden uit hexspeak:
* DEADBEEF ("dead beef") is vaak gebruikt om een software crash of deadlock in embedded systemen aan te geven.
* CAFEBABE ("cafe babe") is oa. door de Java programmeertaal gebruikt om een Java bytecode class file aan te geven.
* DEADDEAD ("dead dead") is de bug check (STOP) code die getoond wordt bij het oproepen van een Blue Screen of Death. Het zijn vooral driver ontwikkelaars die dit kunnen zien, omdat dit gebruikt wordt om een memory dump te verkrijgen op een Windows NT gebaseerd systeem.
* 8BADF00D ("ate bad food") is gebruikt door Apple in iOS crash rapporten, als een applicatie te lang wacht om te starten, stoppen of te antwoorden op systeemgebeurtenissen.
* FEE1DEAD ("feel dead") is gebruikt in de Linux reboot system call.

## Hex editors en packet sniffers

* De hex editor "Bless"
* De packet sniffer "Wireshark"
Om bestanden op bitniveau te bekijken worden hex editors gebruikt. Alhoewel hun naam anders doet vermoeden kan je er vaak niet alleen bestanden in hexadecimale vorm bekijken, maar kan je dit ook doen in binaire, octale en decimale variant. Vaak zal men ook per byte het overeenkomstig ASCII-teken weergeven.
Bij netwerkverkeer heeft men het niet over een hex editor, maar over een packet sniffer. Je merkt gelijkaardige mogelijkheden zoals bij de hex editors, maar zo'n programma is slimmer, daar het de afzonderlijke protocollen kan herkennen (HTTP, TCP, IP, ARP, Ethernet,...). De bekendste packet sniffer is wellicht Wireshark.