Toon posts:

[C#] Mappen van byte-array op struct

Pagina: 1
Acties:

Verwijderd

Topicstarter
Mede programmers,

Ik kom uit de C/C++ wereld en was nu even bezig om een analyse applicatie te maken in C#, waar ik om de haverklap tegen typische C# starters problemen aanloop. Uit het volgende probleem kom ik helaas niet uit dus hopelijk met wat support van jullie kant....

Er is data ontvangen via UDP en deze staat in een byte[] keurig te wachten voor analyse.
Deze data (verzonden door PABX [telefooncentrale]) bestaat uit een vaste header met daarna variabele lengte aan analysedata. Mijn vraag is: hoe map ik het eerste blok van bytes op deze struct?

In code (snippets uit mijn applicatie):
Vanaf regel 30 is mijn probleem neergezet.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  // Het structuur waar ik een deel van de ontvangen bytes op wil mappen
  struct RtSignalDumpStruct   // even flink gestript
  {
    public uint     m_DumpCounter;
    public ushort   m_Identity;
    public uint     m_SendingPacb;
    public ushort   m_NrSignalDataBytes;
  };
  private RtSignalDumpStruct  m_SignalDumpHeader;
    
  // Het asynchrone afhandelen van de UDP-socket (inclusief de buffer)
  // ----------------------------------------------------------
  private byte [] m_SockBuffer = new byte[MAX_DATA_BUFFER_SIZE];
  
  ...  // klaarzetten van socket voor async ontvangst
  AsyncCallback recieveData = new AsyncCallback( OnRecievedData );
  fi_Socket.BeginReceive( m_SockBuffer, 0, m_SockBuffer.Length, 
                          SocketFlags.None, recieveData, fi_Socket );

  ...  // en de code binnen de callback routine
  Socket mySocket = (Socket)ar.AsyncState;
  int nBytesRec    = mySocket.EndReceive( ar );

  // Nu afhandelen van de data
  // --------------------
  if ( nBytesRcv > 0 )
  {
     // Hier is mijn probleem:
     // Stel ik heb 100 bytes ontvangen. Hiervan is sizeof(RtSignalDumpStruct) 
     // de header waarvan RtSignalDumpStruct.m_NrSignalDataBytes aangeeft 
     // hoeveel overige data nog volgt (in dit voorbeeld 100-12=88).
 
     // In C/C++ spiegelde je het structuur over de data via bijvoorbeeld:
     //   RtSignalDumpStruct* pStruct = (RtSignalDumpStruct*)&deDataBlock;
     //   pStruct->m_NrSignalDataBytes  .......  etc
   
     // --------------------------------
     // Wat is DE methode hiervoor binnen C# zodat ik de members
     // van RtSignalDumpStruct normaal kan uitlezen ????
     // --------------------------------
  }

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Er zijn wel methodes om dat uit te lezen uit unmanaged geheugen (System.Runtime.InteropServices.Marshal), maar binnen managed kun je denk ik alleen gebruik maken van een BinaryReader.

C#:
1
2
3
4
5
BinaryReader reader = new BinaryReader(new MemoryStream(m_SockBuffer, 0, nBytesRcv));

m_SignalDumpHeader.m_DumpCounter = reader.ReadUInt32();
m_SignalDumpHeader.m_Identity = reader.ReadUInt16();
// enzovoorts...

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Verwijderd

Topicstarter
Korben schreef op donderdag 14 juli 2005 @ 12:38:
Er zijn wel methodes om dat uit te lezen uit unmanaged geheugen (System.Runtime.InteropServices.Marshal), maar binnen managed kun je denk ik alleen gebruik maken van een BinaryReader.

C#:
1
2
3
4
5
BinaryReader reader = new BinaryReader(new MemoryStream(m_SockBuffer, 0, nBytesRcv));

m_SignalDumpHeader.m_DumpCounter = reader.ReadUInt32();
m_SignalDumpHeader.m_Identity = reader.ReadUInt16();
// enzovoorts...
Thanks...
In ieder geval heb ik nu weer twee uitgangspunten waarmee ik verder kan gaan doorspitten!

Edit:
Is de genoemde managed code niet een behoorlijke performance penalty?

[ Voor 6% gewijzigd door Verwijderd op 14-07-2005 14:30 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:23
HIer http://www.aspheute.com/artikel/20020207.htm staat wat vermeld over union-achtige dingen in C#, misschien dat je daar wat aan hebt?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.