14.12.2004: Změněny požadavky na třídu
buffer
.
20.12.2004: Doplněny informace o vzorovém příkladu.
Jestliže nevidíte správně česká písmena, zvolte potřebné kódování češtiny manuálně.
Každá zakódována položka má tři části: tag, délka obsahových dat a obsahová data.
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é.
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.
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:
iterator
- reprezentuje typ iterátor.
put
- zapíše oktet na konec bufferu (void put(unsigned char)),
begin
- vrací iterátor ukazující na počátek proudu (iterator begin()) a
end
- vrací iterátor ukazující za konec proudu (iterator end()).
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).
/export/e1/pb161
/
váš_login
nastaven tak, že do něj máte přístup pouze vy a vyučující. Přístupová práva ke
svému adresáři neměňte, abyste nezpřístupnili svůj program jiným studentům a
nedostali se tak do rozporu s předchozím bodem. Programu nastavte (ponechte)
stejná přístupová práva, jaká jste měli dávat ostatním programům vytvářeným ve
cvičení (tj. r--
, a to pro skupinu i pro "ostatní") - před
"ukradením" programu vás chrání právě zmíněné nastavení práv Vašeho
adresáře. Analogicky zabezpečte i adresář, v němž budete program vyvíjet.berstream.h
a implementaci třídy
berstream.
C; uložte je do adresáře /export/e1/pb161
/
váš_login/
zaver
.
Pro otestování si sestavte vhodný testovací program berstreammain.C
, ten
také odevzdejte, ale nebude hodnocen.oberstream
u ukládat do seznamu zapisované hodnoty a až ve funkci
encode
kódovat a zapisovat do bufferu, druhou možností je kódovat
ve výstupních operátorech a v encode
zapisovat už zakódované hodnoty,
třetí (ale složitější) možností je, aby až při iteraci docházelo
ke kódování,buffer
, ať
ten je argumentem funkce encode
a konstruktoru iberstream
. Metoda put by měly být virtuální. iberstream
,
která bude dekódovat vstupní data uložená v bufferu. Pokud tak učiníte, tak nechť existuje jediný
konstruktor s jediným parametrem a to referenci na nekonstantní instanci třídy buffer
a operátory
>>
pro příslušné typy. Pokud je na vstupu nekompatibilní typ, vyvolejte
vhodnou výjimku, která má předka std::exception
.
Pokud naleznete tag sekvence, přečtete velikost
sekvence a pokračujte dále jako by jste na sekvenci nenarazili. V případě
jakékoliv chyby není definováno, jaká hodnota bude při čtení dat vrácena. Jen
zajistěte, výjimku v případě, že dojde k pokusu o čtení z prázdného bufferu;
výjimka nechť je potomkem třídy std::exception
./home/jkucera/pb161/zaver/berstreammain
berstream.
C má 412 řádků (9034 znaků),
hlavičkový soubor berstream.h
211 řádků (4626 znaků); studentům však nejsou k dispozici.
Obsahuje i nepovinné rozšíření. Program vypíše zakódovaná data a dekóduje
je zpět. Pokud by nebyla totožná s originálem, ohlásí chybu, jinak mlčí.![]() |
![]() |