C #: Problem med DynamicCastHelper aka flytte en rekke til en struct

stemmer
0

En stund siden jeg spurte deg et annet spørsmål ( Klikk her for å se på spørsmålet ).

Dette er mitt problem når du bruker som kilde filen du ga meg:

public unsafe struct tPacket_5000_E
{
    public Int16 size;
    public Int16 opcode;
    public byte securityCount;
    public byte securityCRC;
    public byte flag;
    fixed byte blowfish[8];  //Please NOTE THIS
    public Int32 seedCount;
    public Int32 seedCRC;
public fixed Int32 securityseed[19];
};

Struct er merket som usikre, på grunn av de Blow array.I kunne ikke finne noen annen måte for å erklære en matrise innvendig struktur.

Problemet: Når jeg analysere pakken til den strukturen, gjør funksjonen ikke sette noe i Blowfish [8], er det som det doesnt exist.Instead det setter byte i seedCount og seedCRC stedet i Blowfish eller securityseed. De er alltid tom

Dette er min kode:

 tPacket_5000_E packet = new tPacket_5000_E();
 packet = (tPacket_5000_E)CDynamicCastHelper.CastIntoFields(packet, data2, CastOptions.ReverseDWord | CastOptions.ReverseDWord);

Hvorfor det ikke fungerer for arrays? Er det fordi det er utrygt?

Takk på forhånd!

Publisert på 27/03/2009 klokken 13:41
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Se på MarshalAs attributt i stedet.

Svarte 27/03/2009 kl. 13:46
kilden bruker

stemmer
0

DynamicCastHelper bruker attributtet DynamicCastHelperSizeAttribute å fortelle den hva størrelsen på en rekke felt er - du trenger ikke å gjøre det fast. Den bruker Refleksjon å finne ut hva de feltene i struct / klassen og de ovennevnte attributtet forteller det størrelsen på arrays.

Du trenger å gjøre noen endringer i CDynamicCastHelper.cs for at det skal fungere: (a) Refleksjon forteller deg byte eller byte [] er System.Byte og System.Byte [] hhv. Så hvor koden er ute etter type "byte []", endre dette til "System.Byte []". System.Byte tilsvarer byte . (b) I funksjon _GenerateFieldsCast, kontrollerer det for å se om hvert felt er en klasse eller en primitve type. System.Byte har [] IsClass lik sant, så du må eksplisitt tvinge System.Byte [] for å bli behandlet som en primitiv type (slik at det binære leseren vil lese direkte inn i det):

if (objField.FieldType.IsClass && objField.FieldType != typeof(System.Byte[]))

Eksempel på bruk:

public class SampleClass2b
{
    public Int16 a;
    [DynamicCastHelperSizeAttribute(5)]
    public byte[] ba; //{ get; set; }
    [DynamicCastHelperSizeAttribute(4)]
    public byte[] bb; //{ get; set; }
    public Int32 c;
}
byte[] data2b = new byte[] { 0, 17, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 10 };
SampleClass2b clas2b = new SampleClass2b();
CDynamicCastHelper.CastIntoFields(clas2b, data2b, CastOptions.ReverseDWord | CastOptions.ReverseWord);
Svarte 28/02/2010 kl. 18:30
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more