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);
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;
};
[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()
{
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;
}
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!