C#:DynamicCastHelper的问题,即将数组移动到结构中

时间:2009-03-27 13:41:49

标签: c# struct pointers

前一段时间我问了你另一个问题(Click here to view the question)。

使用您提供给我的源文件时,这是我的问题:

public unsafe struct tPacket_5000_E
{
    public Int16 size;
    public Int16 opcode;
    public byte securityCount;
    public byte securityCRC;
    public byte flag;
    fixed byte blowfish[8];  //Please NOTE THIS
    public Int32 seedCount;
    public Int32 seedCRC;
public fixed Int32 securityseed[19];
};

由于河豚数组,结构被标记为“不安全”。我找不到任何其他方式在结构内声明数组。

问题:当我将数据包解析为该结构时,该函数不会在blowfish中添加任何内容[8],它就像它不存在一样。相反,它将字节放在seedCount和seedCRC中,而不是在blowfish或securityseed中。 它们总是空的

这是我的代码:

 tPacket_5000_E packet = new tPacket_5000_E();
 packet = (tPacket_5000_E)CDynamicCastHelper.CastIntoFields(packet, data2, CastOptions.ReverseDWord | CastOptions.ReverseDWord);

为什么它不适用于数组?是吗,因为它不安全?

提前致谢!

2 个答案:

答案 0 :(得分:1)

请查看MarshalAs属性。

答案 1 :(得分:0)

DynamicCastHelper使用DynamicCastHelperSizeAttribute属性来告诉它数组字段的大小是什么 - 无需修复它。它使用Reflection来计算struct / class的字段是什么,上面提到的属性告诉它数组的大小。

您需要在CDynamicCastHelper.cs中进行一些更改才能使其正常工作: (a)Reflection告诉你byte或byte []分别是System.Byte和System.Byte []。 因此,在代码查找类型“byte []”的地方,将其更改为“System.Byte []”。 System.Byte等同于 byte 。 (b)在函数_GenerateFieldsCast中,它检查每个字段是类还是原始类型。 System.Byte []使IsClass等于true,因此您需要显式强制System.Byte []作为基本类型处理(以便二进制读取器直接读入它):

if (objField.FieldType.IsClass && objField.FieldType != typeof(System.Byte[]))

使用示例:

public class SampleClass2b
{
    public Int16 a;
    [DynamicCastHelperSizeAttribute(5)]
    public byte[] ba; //{ get; set; }
    [DynamicCastHelperSizeAttribute(4)]
    public byte[] bb; //{ get; set; }
    public Int32 c;
}
byte[] data2b = new byte[] { 0, 17, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 10 };
SampleClass2b clas2b = new SampleClass2b();
CDynamicCastHelper.CastIntoFields(clas2b, data2b, CastOptions.ReverseDWord | CastOptions.ReverseWord);