PB161 Jazyk C++ - závěrečný příklad B (BER)

BER kódování (30 - 35 bodů)

14.12.2004: Změněny požadavky na třídu buffer.
20.12.2004: Doplněny informace o vzorovém příkladu.

Případné další změny budou rovněž vyznačeny červeně!

Jestliže nevidíte správně česká písmena, zvolte potřebné kódování češtiny manuálně.

Úvod:

Basic Encode Rules (BER) je definováno ITU-T Recommendation X.690, ISO/IEC JTC1/SC21. Používá se společně s ASN1. BER popisuje jak nezávisle na platformě binárně zakódovat různé typy, včetně bitového uspořádání a endianity. BER víceoktetová (tj. vícebajtová) čísla kóduje s velkým endianem, (tj. tři oktety na vstupu/výstupu ff, 00 a 11 je číslo 0xff0011). Prvním bitem budu rozumět nejméně významný bit oktetu (0x1), 8. bit je tedy nejvýznamnější bit oktetu (0x80).

Každá zakódována položka má tři části: tag, délka obsahových dat a obsahová data.

Tag:

Bity 1 až 5 obsahují hodnotu tagu, bit 6 při nastavení (tj. je-li roven 1) říká, že tag je konstruovaný a při nenastavení se jedna o jednoduchý typ. Ostatní bity tagu jsou pro nás nedůležité.

Délka obsahových dat:

Obsahová data:

Záleží na tagu.

1 - definuje booleovou hodnotu. True se kóduje na nenulovou obsahovou hodnotu, false se kóduje na nulovou obsahovou hodnotu.

01 01 ff - true
01 01 00 - false

2 - definuje celočíselnou hodnotu. Je kódovaná ve dvojkovém doplňku.

02 01 00: 0
02 01 7f: 127
02 01 ff: -1
02 01 80: -128
02 01 81: -127
02 02 00 80: 128

16 - definuje sekvenci a je to konstruovaný typ. Obsahová data jsou kódovaná podle stejných pravidel jaká byla uvedena.

 22 - definuje IA5String, což je klasické ASCII kódování, nepředpokládejte, že bude na vstupu jiný znak než ASCII.

Existuje více typů, ale jejich kódování není požadováno.

Zadání:

Vaším úkolem je vytvoření třídy oberstream, která bude mít operátory << pro zápis do proudu a to pro typy bool, int, long int, unsigned long int, a const char *. Dále budou existovat dva manipulátory: begin (specifikuje vstup do sekvence) a end (výstup ze sekvence). Posledním požadavkem je existence funkce encode, která má jediný argument typu reference na buffer. Funkce zakóduje zapsaná data do třídy buffer.

Dále vytvořte šablonovou třídu buffer, která bude mít atribut:

a metody: Pokud bude argumentem šablony některý ze základních typů (unsigned int, int, unsigned long int, long int a double), vrátí dereferencovaný iterátor hodnotu příslušného typu; avšak pokud argument šablony bude char,  vrátí se např. std::list<std::string>::iterator, hodnota bude kódována hexadecimálně a bez prefixu (tj. např. a0).

Požadavky:

Poznámky:


Předchozí Hlavní stránka závěrečných příkladů Hlavní stránka Hlavní stránka PB161