Als je de grot verlaat en open water bereikt, ontvang je een bericht van de Elfen op het schip.

Het bericht is verzonden met het Buoyancy Interchange Transmission System (BITS), een methode om numerieke uitdrukkingen voor te stellen als een binair datapakket. De computer van je onderzeeër heeft het bericht in hexadecimaal1 formaat opgeslagen (de invoer van deze opgave).

De eerste stap bij het decoderen van het bericht, is om de hexadecimale voorstelling om te zetten naar een binaire voorstelling. Elk hexadecimaal cijfer komt overeen met vier bits in de binaire voorstelling van het datapakket:

0 = 0000
1 = 0001
2 = 0010
3 = 0011
4 = 0100
5 = 0101
6 = 0110
7 = 0111
8 = 1000
9 = 1001
A = 1010
B = 1011
C = 1100
D = 1101
E = 1110
F = 1111

Het BITS-bericht vat één enkel pakket in de buitenste laag die zelf verschillende andere pakketten kan bevatten. De hexadecimale voorstelling van dit pakket kan aan het einde een paar extra 0-bevatten. Deze maken geen deel uit van het bericht en moeten genegeerd worden.

Elk bericht begint met een standaard header: de eerste drie bit coderen de versie van het pakket, en de volgende drie bits coderen de type ID van het pakket. Deze twee waarden zijn getallen en alle getallen die in het pakket gecodeerd zitten worden in binair formaat voorgesteld, met de meest significante bits eerst. Zo stelt een versie die gecodeerd wordt als de binaire reeks 100 bijvoorbeeld het getal 4 voor.

Pakketten met type ID 4 stellen een letterlijke waarde voor. Pakketten met letterlijke waarden coderen één enkel binair getal. Om dit te doen wordt het binair getal opgevuld met voorloopnullen totdat de lengte een veelvoud van vier bits is. Vervolgens wordt het opgedeeld in groepen van vier bits. Elke groep wordt voorafgegaan doot een 1-bit, behalve de laatste groep die voorafgegaan wordt door een 0-bit. Deze groepen van vijf bits volgen onmiddellijk na de header van het pakket. Zo wordt de hexadecimale reeks D2FE28 bijvoorbeeld:

110100101111111000101000
VVVTTTAAAAABBBBBCCCCC

Onder elk bit staat een label die de rol van het bit aangeeft:

Dit pakket stelt dus de letterlijk waarde met binaire voorstelling 011111100101 voor, wat overeenkomt met 2021 in decimale voorstelling.

Elk ander type pakket (elk pakket met een type ID die verschilt van 4) stelt een bewerking voor die één of andere berekening uitvoert op één of meer deelpakketten die erin vervat zitten. Op dit moment zijn de specifieke bewerkingen niet belangrijk, en focussen we ons op het ontleden van de hiërarchie van deelpakketten.

Een bewerkingspakket bevat één of meer deelpakketten. Om aan te geven wat de volgende binaire gegevens zijn die de deelpakketten voorstellen, kan een bewerkingspakket één van twee modi gebruiken. Dit wordt aangegeven door de bit die onmiddellijk volgt op de header van het pakket, en die de lengte-type ID genoemd wordt:

Ten slotte staan na de lengte-type ID en het veld met 15 of 11 bits de deelpakketten die in het pakket vervat zitten.

Dit is bijvoorbeeld een bewerkingspakket (hexadecimale string 38006F45291200) met lengte-type ID 0 die twee deelpakketten bevat:

00111000000000000110111101000101001010010001001000000000
VVVTTTILLLLLLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBBBBBB

Na het verwerken van de 11 en 16 bits aan data voor de deelpakketten, is de totale lengte die aangegeven wordt in L (27) bereikt, en stopt dus het ontleden van dit pakket.

Als een ander voorbeeld is hier een bewerkingspakket (hexadecimale string EE00D40C823060) met lengte-type ID 1 die drie deelpakketten bevat:

11101110000000001101010000001100100000100011000001100000
VVVTTTILLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBCCCCCCCCCCC

Na het verwerken van de drie volledige deelpakketten, is het aantal deelpakketten dat wordt aangegeven in L (3) bereikt, en stopt dus het ontleden van dit pakket.

Voorlopig volstaat het om de hiërarchie van pakketten in het verstuurd bericht te ontleden en de versienummers van alle pakketten op te tellen.

Hier zijn nog een aantal voorbeelden van hexadecimaal gecodeerde berichten:

Opgave

Decodeer de structuur van een hexadecimaal gecodeerd BITS bericht. Wat krijg je als je de versienummers van alle pakketten bij elkaar optelt? Bepaal dit op de volgende manier:

Voorbeeld

In deze interactieve sessie gaan we ervan uit dat de tekstbestanden transmission01.txt2, transmission02.txt3, transmission03.txt4, transmission04.txt5 en transmission05.txt6 zich in de huidige directory bevinden.

> decode("transmission01.txt")
16
> decode("transmission02.txt")
12
> decode("transmission03.txt")
23
> decode("transmission04.txt")
31
> decode("transmission05.txt")
945