在C#和pragma pack中有类似的东西来处理字节流吗?

时间:2017-05-18 20:31:27

标签: c# stream byte pragma pack

我对C#很陌生,我必须处理收到的字节流。在C ++中,我经常使用类似的东西:

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

然后当我收到一个字节数组时,我可以这样做:

tHEADER header*;

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

当我想阅读收到的电报或创建一个新电报时,我能在C#中做些类似的事吗?或者我可以只做这样的事情:

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

1 个答案:

答案 0 :(得分:0)

我认为你能做的最好的事情是使用BinaryWriter,然后创建一个小类来保存数据。你也可以使用BinaryReader来读取字节。有一个BinaryFormatter,但我很确定它中有额外的元数据(不要让我这样做)。

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