【问题标题】:Is there something similar in C# to pragma pack to handle a byte stream?C# 中是否有类似于 pragma pack 的东西来处理字节流?
【发布时间】:2017-10-18 19:53:49
【问题描述】:

我对 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

【问题讨论】:

标签: c# stream byte pragma pack


【解决方案1】:

我认为你能做的最好的事情是使用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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2011-12-04
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多