我对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
答案 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();
}
}
}