【发布时间】:2014-03-06 18:36:20
【问题描述】:
我的文件中有几个结构。我想传递一个字节数组并初始化结构。我已经尝试过从结构到字节数组的转换,反之亦然,但我收到了诸如“尝试读取或写入受保护的内存”之类的错误。所以我认为传递字节数组来初始化结构可能更有效。我的问题是结构的一部分取决于第一个字节类型。那么如何为它分配另一个结构呢?
代码如下:
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct Payload
{
MessageTypeID ID1;
MessageTypeID ID2;
Byte[] PayloadData;
public Payload(byte[] payloadArray)
{
this.ID1 = (MessageTypeID) payloadArray[0];
this.ID2 = (MessageTypeID) payloadArray[1];
switch (this.ID1)
{
case MessageTypeID.TEMPERATURE:
byte[] tempPayloadArray = new byte[payloadArray.Length - 2];
Temperature temp = new Temperature(Array.Copy(payloadArray,2,tempPayloadArray,0,payloadArray.Length - 2);
this.PayloadData = temp; <== ERROR: Cannot convert Temperature to byte[]
break;
case MessageTypeID.LEVEL:
.......
}
}
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Temperature
{
Byte LocalTemp;
Int16 ExternalTemp1;
Int16 ExternalTemp2;
public Temperature(byte[] tempArray)
{
this.LocalTemp = tempArray[0];
this.ExternalTemp1 = tempArray[1];
this.ExternalTemp2 = tempArray[2];
}
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Level
{
Byte FluidLevel;
Int16 FreshnessTimer;
Byte CalibrationChannelReading;
public Level(byte[] levelArray)
{
this.FluidLevel = levelArray[0];
this.FreshnessTimer = BitConverter.ToInt16(levelArray, 1);
this.CalibrationChannelReading = levelArray[3];
}
}
【问题讨论】:
-
请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。
-
为什么要将 temp 分配给 PayLoadData?如果您的要求是您需要一个需要分配给表示结构数据的 PayLoadData 的新字节数组,那么让 Tempearate 和其他结构返回它表示的字节数组。 (如果所有结构都这样做,您可以将其保留在基类中)
-
我想构造数组,如果有效负载是例如类型温度,然后字节被组织在正确的字段中。