C #: проблема с DynamicCastHelper или перемещением массива в структуру - PullRequest
0 голосов
/ 27 марта 2009

Недавно я задал вам еще один вопрос ( Нажмите здесь, чтобы посмотреть вопрос ).

Это моя проблема при использовании исходного файла, который вы мне дали:

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. Я не смог найти какой-либо другой способ объявить массив внутри структуры.

Проблема: когда я анализирую пакет в этой структуре, функция ничего не помещает в 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 ]

1 голос
/ 27 марта 2009

Вместо этого посмотрите на атрибут MarshalAs.

0 голосов
/ 28 февраля 2010

DynamicCastHelper использует атрибут DynamicCastHelperSizeAttribute, чтобы сообщить ему, каков размер поля массива - нет необходимости фиксировать его. Он использует Reflection для определения полей структуры / класса, а упомянутый выше атрибут сообщает ему размер массивов.

Вам нужно внести некоторые изменения в CDynamicCastHelper.cs, чтобы он работал: (a) Отражение говорит вам, что байтом или байтом [] являются System.Byte и System.Byte [] соответственно. Поэтому, когда код ищет тип «byte []», измените его на «System.Byte []». System.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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...