Bevezetés az alfanumerikus adatok reprezentációjába
Azok az olvasók, akik járatosak a számok, karakterek, és szimbolumok digitális reprezentációjába, átugorhatják ezt a fejezetet. A DICOM szabvány nem megérthető anélkül, hogy "jeleket" tudjunk reprezentálni a számítógépen .
A legalapvetőbb fogalom a digitális képreprezentációban a "bit". A fizikai bit olyan egység, melynek két állapota van. Például egy magasabb / alacsonyabb feszültségérték két pont között mérve, vagy: elektromos áram folyik / nem folyik egy adott vezetéken, stb. A konkrét fizikai megvalósítástól függetlenül felfoghatjuk a bitet két lehetséges logikai állapotként, egy absztrakt egységnek, melyet úgy hívunk: bit.
A szokásos jelölés erre a két állapotra a 0 és az 1.
Innentől nem törődünk e két logikai állapot valós fizikai reprezentációjával. Annyi fontos, hogy e két állapot alapján a számítógép kódolhat/felismerhet alfanumerikus karaktereket. Lényeges, hogy karakterek (betűk) vagy más nem numerikus szimbólumok esetén a kódolás tetszőleges. Számok esetében viszont a kettes számrendszer szerinti (bináris) reprezentáció rengeteg előnyt jelenthet számunkra. Ez egyértelmű, hiszen a két lehetséges számjegy a bináris felírásban az 1 és a 0. Mielőtt bevezetnénk a bináris felírást, először leírjuk, hogyan csoportosíthatjuk a biteket. A számítógépek általában nem egyenként találkoznak a bitekkel, hanem négyesével csoportosítva, ez a
16 különböző fél bájt lehetséges, amint az a táblázatból is látszik:
A 4 bit | A megfelelő hexadecimális jel | A megfelelő decimális szám | |
0000 | 0 | 0 | |
0001 | 1 | 1 | |
0010 | 2 | 2 | |
0011 | 3 | 3 | |
0100 | 4 | 4 | |
0101 | 5 | 5 | |
0110 | 6 | 6 | |
0111 | 7 | 7 | |
1000 | 8 | 8 | |
1001 | 9 | 9 | |
1010 | A | 10 | |
1011 | B | 11 | |
1100 | C | 12 | |
1101 | D | 13 | |
1110 | E | 14 | |
1111 | F | 15 |
Itt:
- hexadecimális : 16-os számrendszer, a helyiértékek decimálisan: 1, 16, 256, ...
- decimális: 10-es számrendszer, a helyiértékek: 1, 10, 100, 1000...
- bináris: 2-es számrendszer: a helyiértékek: 1, 2, 4, 8, 16...
Érdekes, hogy az általunk használt tízes számrendszer nem az egyetlen valaha használt rendszer. A maják a vigezimális rendszert használták, a 20-as számrendszert és ismerték a 0-t; a mezopotámiaiak a sexagezimális (60-as) számrendszert használták, de problémáik akadtak a hiányzó helyiértékekkel, lassan fedezték fel a "semmi" fogalmát.
A táblázat első oszlopa egy félbájt 16 különböző állapotát sorolja fel. A második oszlop tartalma a hexadecimális számjegy (hexa számjegy) a megfelelő félbájtra vonatkozva. A harmadik oszlop a "szokásos" számérték, melyet egy félbájthoz szintén hozzáköthetünk. Ha viszont számokról beszélünk, a félbájt nem
tízes, hanem kettes számrendszerben reprezentál.
A decimális helyértékek bit és félbájt esetén:
a baloldali számjegy decimálisan | a balról második számjegy decimálisan | a jobbról második számjegy decimálisan | a jobboldali második számjegy decimálisan |
8 | 4 | 2 | 1 |
Gyakorlásképpen nézzük a "B" hexa számjegy decimális értékét, mely a
bitfolyamot takarja definíció szerint. A helyiértékek a fenti táblázat alapján tehát jobbról balra haladva számíthatóak: az első tag 1, mert az "egy" helyiértéken található szám 1. A következő helyiérték balra megint 1-es értékű, a helyiérték pedig "kettő", tehát B értékében van még egy "kettő" is; a következő bit balra 0, tehát nincsen "négy" B értékében. Az utolsó bit balra továbbhaladva pedig megint 1, tehát egy "nyolcas" van B értékében. Ezeket összeszámolva:
Tehát B értéke tízes számrendszerben
így tehát "megállapodásunk" alapján B értéke
Ahol B egy hexa számjegy és 11 a decimális értéke.
Tehát így (de)kódolhatjuk az összes 16 félbájtot, ha a számokat akarjuk reprezentálni. Sajnos a félbájt még nem a végső egység, melyet a digitális szám- és alfanumerikus karakter-reprezentációban használunk (eddig csak számokról beszéltünk). Az adatreprezentáció egy jobb egysége a
A bájt két félbájt kombinációja. így 16*16=256 lehetséges kombinációt ad 8 bit, tehát 256 különböző bájt lehetséges. A következő táblázat egy részét tartalmazza a lehetséges 256 bájt értéknek. A decimális értékek számítási módját is megadtuk. Az első félbájt értékét tehát meg kell szorozni 16-tal, és végül a kettőt össze kell adnunk.
A két félbájt | a bájt decimális értéke | ||
00 | 0*16+0=0 | ||
01 | 0*16+1=1 | ||
02 | 0*16+2=2 | ||
... | ... | ||
19 | 1*16+9=25 | ||
1A | 1*16+10=26 | ||
1B | 1*16+11=27 | ||
... | ... | ||
BA | 11*16+10=186 | ||
BB | 11*16+11=187 | ||
BC | 11*16+12=188 | ||
... | ... | ||
FE | 15*16+14=254 | ||
FF | 15*16+15=255 |
Világos tehát, hogy egy bájt tízes számrendszerben 0 és 255 közötti számokat tud reprezentálni (összesen 256 lehetőség). Általában 1 bájt nem elég, hogy a gyakorlatban előforduló értékeket leírja. A következő egység a dupla-bájt, a
A decimális értékre való átszámolást tehát a következőképpen tehetjük meg. Először kiszámoljuk a félbájtok értékét, majd megszorozzuk az első félbájtokat 256-tal. Például:
Még egy megjegyzés. Amikor a numerikus reprezentációt néztük a bájtok sorrendjében, biztosra vettük, hogy jobbról balra kell olvasnunk a helyiértékeket, ahogy a decimális értékeknél is szoktuk. Például láttuk, hogy a következő adatfolyam-értelmezés ez:
Megtehettük volna, hogy visszafelé haladunk, ha korábban úgy állapodunk meg, hogy balról jobbra növekednek a helyiértékek. Ekkor a következő eredményre jutunk:
Ha már a számok reprezentációját megértettük digitális (hexadecimális) formájukban, nézzük meg az alfanumerikus karaktereket, mint például a különböző nyelvek ábécéinek betűit, a központozási jeleket és más szimbólumokat. Fontos, hogy számjegyek állhatnak nem numerikus jelentésben is. Például a "2" szimbólum jelenthet egy hattyút és lehet, hogy semmi köze nincsen a kettes számhoz.
A következő táblázat az u.n. Latin-2 kódtáblázat, ami 256 különböző karakter reprezentációját adja meg a ISO 8859-2 szabvány szerint:
2. ábra
A 2. ábra sorai és oszlopai a hexadecimális karakterekkel vannak megjelölve. Például az "Ő" karakter a D-sorban van és a -5 oszlopban. Tehát a félbájtok, melyek a magyar "Ő" karaktert leírják a D és az 5. A bájt, amit e két félbájt kiad, a D5. Tehát az ISO Latin-2 kódtáblázatban:
Bináris formában (mivel D=1101 és 5=1001)
Ahogy már láttuk, a D5 bájtnak van egy másik jelentése is, ha számként tekintünk rá:
Hogyan tudjuk meg, hogy a D5 akkor mit is jelent?
Láthatjuk, hogy annak a 2 bájtnak, hogy AB 1F most már három különböző jelentése lehet:
43807 | 8207 | Ť és ”nem értelmezhető” | |
Ha a AB 1F egy szám, és a helyiértékék jobbról balra növekednek | Ha a AB 1F egy szám, és a helyiértékék balról jobbra növekednek | ha AB 1F karakterként tekintjük és a Latin-2 kódtáblázat szerint értelmezzük |
Még nagyon sok másik karaktertábla van, és sok numerikus értelmezés is. Ha találkozunk a bájt mentéssel avagy DICOM mentéssel hexadecimális formában, meg kell bizonyosodnunk, hogy értelmezésünk helyes. Például nézzük a következő mentést ami 32 bájtból áll:
4B 65 64 76 65 73 4F 6C 76 61 73 F3 21 4E 65 6D
65 6E 6A 65 6E 65 6C 61 6B 65 64 76 65 64 21 21
Ha ezt a Latin-2 kódolásként értelmezzük, jelentése:
Ha azt feltételezzük, hogy ezek szavak (dupla bájtok) melyeket számokként kell érteni, és a helyiértékek jobbról balra nőnek, akkor 16 különböző számot kapunk.
Általában a szavak a DICOM-ban a képernyő egy pixelének állapotát írják le. Két bájt (4 hexadecimális számjegy) 65536 különböző értéket jelölhet. Egy ilyen négy számjegyű csoportja a hexadecimális számoknak 65536 különböző pixelállapotot takarhat. A legegyszerűbb értelmezés 65536 különböző szürkeskála-értéket jelenthet.
Amit eddig megérthettünk, hogy a félbájt, a bájt, vagy bájtok kombinációja, mint a szó, sokféle különböző interpretációnak ad lehetőséget. Azaz a bájtok halmazát nem tudjuk olvasni anélkül, hogy világosan közölnénk annak szabályait, hogy hogyan kódoljuk a karaktereket, szimbólumokat és számokat. A DICOM szabvány egy része éppen a megengedett kódolási módszerek leírása, később ezzel még foglalkozunk.