2017-05-18 4 views
0

Ich bin ziemlich neu in C# und ich muss einen Byte-Stream behandeln, die ich erhalte. In C++ ich so etwas in der Regel verwendet:Gibt es in C# etwas ähnliches zum Pragma-Paket, um einen Byte-Datenstrom zu verarbeiten?

#pragma pack(push, DTA_VLS, 1) 
typedef struct tsHEADER 
{ 
    WORD    wLength;   
    WORD    wIdCounter;   
    WORD    wxxxx;  
    WORD    wxxxx2;  
} tHEADER; 
#pragma pack(pop, DTA_VLS) 

und dann, wenn ich ein Byte-Array erhielt ich so etwas tun könnte:

tHEADER header*; 

header = receivedByteArray; 
if(header->wLength >0) 
{ 
    do something 
} 

Gibt es etwas ähnliches ich in C# tun könnte, wenn ich will ein empfangenes Telegramm lesen oder ein neues erstellen? Oder kann ich nur so etwas wie das:

byte[] Tel= new byte(5); 
byte[0]= Length; 
byte[1]=ID; 
// and so on 
+0

http://stackoverflow.com/a/1936208/17034 –

Antwort

0

ich glaube, das Beste, was Sie tun können, ist die BinaryWriter verwenden und dann eine kleine Klasse machen, um die Daten zu halten. Sie können auch BinaryReader verwenden, um die Bytes zurück zu lesen. Es gibt eine BinaryFormatter, aber ich bin ziemlich sicher, dass es zusätzliche Metadaten darin hat (halte mich nicht daran).

public class MyPackage 
{ 
    public int Length => 12; // or 16 if Length is included 

    public int Id { get; set; } 

    public int Number1 { get; set; } 

    public int Number2 { get; set; } 

    public byte[] SerializeToBinary() 
    { 
     using (var memoryStream = new MemoryStream()) 
     using (var writer = new BinaryWriter(memoryStream)) 
     { 

      writer.Write(Length); 
      writer.Write(Id); 
      writer.Write(Number1); 
      writer.Write(Number2); 

      return memoryStream.ToArray(); 
     } 
    } 

    public void DeserializeFromBinary(byte[] data) 
    { 
     using(var memoryStream = new MemoryStream(data)) 
     using(var reader = new BinaryReader(memoryStream)) 
     { 
      var length = reader.ReadInt32(); 
      if (length != Length) 
       throw new Exception("Some error if you care about length"); 

      Id = reader.ReadInt32(); 
      Number1 = reader.ReadInt32(); 
      Number2 = reader.ReadInt32(); 
     } 
    } 
} 
Verwandte Themen