next up previous contents
Next: C.7 Prevajalnik protokola RPCGEN Up: C Klicanje oddaljenih procedur Previous: C.5 Nivoji rutin RPC Vsebina: contents

C.6 Kodiranje in dekodiranje podatkov -- XDR

Knjiznica XDR je mnozica podprogramov v jeziku C. XDR skrbi za konverzijo internih zapisov spremenljivk v dogovorjeni zapis. Pri spremenljivkah s plavajoco vejico sovpada z zapisom po IEEE standardu in s padajoco pomembnostjo spominskih celic ( Big-Endian byte ordering). Protokol je XDR predpisan z ARPA NIC dokumentom RFC1014, ki ustreza predstavitvenemu sloju po ISO X.409 predlogu sintakse zapisa.

Kot ze omenjeno imajo racunalniki razlicne procesorje z razlicno osnovno locljivostjo, od zastarelih osem bitnih do novejsih 64 bitnih procesorjev, ki pa se ne locijo le po tem, kako velika so cela stevila, ampak tudi po tem, kako so stevila zapisana v spominu, ki je se vedno v osnovi urejen z byti (8 bitov). Tako locimo med Little-Endian in Big-Endian nacinom zlaganja spremenljivk vecjih od enega byta.

 

 

Slika C.2: Primer razlicnega sestavljanja 32-bitnega stevila

Na sliki C.2 je prikazana razlika v zlaganju celostevilcne spremenljivke po Big-Endian principu, katerega tipicna predstavnika sta Motorola in SPARC, ter Little Endian zlaganje bytov, ki ga najdemo v racunalnikih PC ali VAX. S piko je oznacen bit za predznak. Ocenjevati, kateri nacin sestavljanja je boljsi, tu ne bi imelo smisla, pomembno je le, da se zavedamo razlik.

Rutine knjiznice XDR torej pretvarjajo razlicne interne zapise v enotni format, ki se posreduje nizjemu sloju (slika 5.2). Knjiznica XDR dostopa do transportnega sloja s pomocjo rutin RPC, ki skrbijo se za ostale komunikacije z nizjimi sloji. Pomembno je poudariti, da se za transportni sloj pri XDR lahko uporabijo tudi drugi mediji, kot je na primer datoteka. Uporabnost dela knjiznice XDR je ze v tem, da imamo na voljo rutine, ki jih lahko uporabimo tudi v namene, ki niso vezani na knjiznico RPC. Tako jih je mozno uporabiti za generiranje in interpretiranje razlicnih graficnih datotek.

Podprogrami se v knjiznici XDR delijo na stiri skupine:

Rutine za konverzijo so dvosmerne, kar pomeni, da imamo en sam podprogram za kodiranje in dekodiranje podatkov istega tipa. Te rutine imajo podobno zgradbo, vsaka z dvema argumentoma od katerih je prvi struktura XDR, drugi pa je kazalec na spremenljivko ustreznega tipa, ki jo kodirano ali dekodiramo.

   bool_t xdr_proc(xdrs, argresp)
          XDR *xdrs;
          <tip> *argresp;

Iz navedenega je opaziti, da so deklaracije funkcij v jeziku C zapisane po standardu K&R, ki je na sistemih UNIX se vedno najbolj razsirjen. Obstajajo tudi prototipi ANSI, vendar njihova uporaba zmanjsa prenosljivost programa napisanega za RPC.

Struktura oz. izpeljani tip XDR ima poleg ostalih internih spremenljivk, ki niso veliko uporabljene, se enumerirano spremenljivko xdr_op s katero se doloca tip operacije pri klicanju procedure. Te operacije so:

   enum xdr_op {
           XDR_ENCODE = 0,
           XDR_DECODE = 1,
           XDR_FREE = 2
   };
Poleg samo razumljivih operacij za kodiranje in dekodiranje se pri sestavljenih (kompleksnih) tipih uporablja se operacija XDR_FREE, ki sprosti spomin pri brisanju teh tipov.

Poleg konverzije enostavnih in sestavljenih tipov je za vecje kolicine podatkov mozno uporabiti tokove ( streams). Tokovi so po funkcionalnosti zelo podobni klasicnim vhodno/izhodnim operacijam za branje in pisanje datotek. Poleg omenjenih tokov je mozno uporabiti tudi kvazi datoteke, ki pa se nahajajo v spominu racunalnika. Prakticna uporabnost takih tokov se pokaze pri paketnem prenosu vecjega stevila podatkov. Posebna vrsta tokov je tudi tok z zapisi ( Record Stream), ki je podoben direktnim datotekam v jeziku Fortran, le da je tu velikost zapisa lahko spremenljiva. Uporabnost takega toka se kaze pri prenosu standardiziranih manjsih sestavljenih podatkov. Tipicna aplikacija, ki uporablja take zapise je relacijska baza podatkov.

Osnovni filtri oz. rutine za konverzijo obstajajo za interne tipe:

xdr_char()
pretvorba nizov (stringov)
xdr_short(), xdr_u_short()
skrajsana cela predznacena in nepredznacena stevila
xdr_int(), xdr_u_int()
cela predznacena in nepredznacena stevila
xdr_long()
podaljsana cela stevila
xdr_float()
realna stevila
xdr_void()
prazno
xdr_enum()
nastevni tipi

Navedene rutine obstajajo tudi v predprocesorski ( macro) obliki.

Filtri za sestavljene tipe so lahko le tisti za katere poznamo osnovne tipe iz katerih so sestavljeni. Tako je mozno sestaviti spremenljivo dolzino bytov z xdr_bytes(), nize znakov xdr_string, vektorje z xdr_vector(), matrike z xdr_array in xdr_opaque za vektor poljubnih tipov, ki pa se ne konvertira.

Iz nastetih sestavljenih in osnovnih tipov lahko uporabnik naredi svoje izpeljane filtre, ki jih v aplikaciji potrebuje. Pri pisanju uporabniskih filtrov je potrebno upostevati omejitve, ki so posledica nacina konverzije. Tako je potebno vecdimenzionalne tabele in strukture razbiti na vec osnovnih ali sestavljenih tipov.



Copyright © 1995 Leon Kos, Univerza v Ljubljani