[ Reljam @ 21.06.2002. 21:51 ] @
U zavisnosti od toga sta radite, moze da se desi da vam zatreba da u C#-u radite sa C-olikim struktovima: primer toga bi bio slanje podataka na socket po nekom protokolu. Iz jednog ili drugog razloga sam skoro morao da implementiram deo Kerberos autentikacije u C#-u, tako da sam odlucio da iskoristim stvari koje sam naucio i da barem malo olaksam zivot drugima: Problem je vrlo jednostavan: Recimo da hocu ovo da uradim u Cu: Code: struct MYSTRUCT Data; Data.a=3; Data.b=5; SendToSocket((char*) &Data); Deluje jednostavno, zar ne? E sada, u C#-u nije dozvoljeno tako olako baratanje pointerima. Sto se toga tice, ni raspored polja u structu nije zagarantovan da ce ostati onakav kako ga vi specificirate. Da bi se tako nesto uradilo, potrebno je ovako definisati C# struct: Code: [StructLayout(LayoutKind.Sequential, Pack=1)] protected struct MessageHeader { public ushort type; public ushort entry; }; LayoutKind.Sequential oznacava da ovaj struct treba da postoji u memoriji u onom redosledu po kome su definisana polja, bas kao u C-u. Pack=1 pakuje podatke na 1 bajt, dakle radi istu stvar kao ta opcija u C-u. Sledeci "trik" je definisati funkciju koja barata sa podatcima kao "unsafe" - to omogucuje koriscenje pravih pointera: Code: protected unsafe void FastHandler() { I sada nastupa zanimljiv deo - alocira se niz memorije, i onda se 'baci' pointer na njega, koji se kastuje u odgovarajuci tip podataka: Code: byte []outArray = new Byte[PACKET_SIZE]; fixed (byte *outBytes=outArray) { MessageHeader *AuthRep=(MessageHeader*) outBytes; AuthRep->type = 3; AuthRep->entry = 5; } fixed naredjuje Garbage Collectoru da fiksira lokaciju objekta outArray u memoriji i da je ne pomera dok se ne zavrse operacije sa pointerima. Naravno ovo je samo mali primer, isti efekat bi mogao da se napravi i bez pointera, ali ono gde se ova metoda primenjuje je recimo unos podataka sa socketa i "kastovanje" tih podataka u odgovarajucu strukturu. U svakom slucaju, ova metoda moze da bude korisna kada zatreba neka manipulacija bajtova i structova... Srecno sa radom! |