Небезопасный указатель Int32 на массив Byte [] - PullRequest
4 голосов
/ 30 января 2011

У меня есть байтовый массив, к которому я хотел бы получить доступ по указателю Int32 (небезопасный контекст). Я делаю это

byte[] bgImageBytes = new byte[1000];
unsafe
{
   fixed (byte* bgImgPtr = bgImageBytes)
   {
      // I have a byte pointer ... How can I get an Int32 pointer?
   }
}

Я уже без проблем обращаюсь к указателю, возвращенному из kernel32.dll как к байтному и Int32-указателю. Но когда я пытаюсь сделать указатель Int32 на массив управляемых байтов (пример выше), он, кажется, жалуется на то, что он является управляемым кодом, поэтому он не будет работать.

Простое выполнение UInt32* bgImgIntPtr = (UInt32*)bgImgPtr; приводит к MDA FatalExecutionEngineError: CLR был смертельно поврежден. Это чаще всего вызвано повреждением данных, которое может быть вызвано рядом проблем, таких как вызовы некорректных функций вызова платформы и передача неверных данных в CLR.

Моя цель: иметь указатели UInt32 и Byte на один байтовый массив, чтобы я мог читать «тепловую карту» Kinect как в виде целого числа, так и в виде отдельных цветов. Я знаю, что могу легко конвертировать между типами, но так как я работаю с несколькими массивами в разных форматах, было бы намного лучше, если бы я мог обращаться к ним напрямую, не конвертируя между ними все время. Происходит много простого копирования, так что это просто добавит накладные расходы для продолжения конвертации.

1 Ответ

6 голосов
/ 30 января 2011

Хорошо, забавная история. Оказывается, можно не только ссылаться на нулевой массив, но он также указывает куда-то. Это действительно испортило мою отладку.

«UInt32 * bgImgIntPtr = (UInt32 *) bgImgPtr;» это приводит к исключению MDA, потому что массив был неинициализирован. Создание указателя на байтовый указатель, который идет к байтовому массиву, - правильный путь.

Ответ:

byte[] bgImageBytes = new byte[1000];
unsafe
{   
   // Make a byte pointer to the byte array
   fixed (byte* bgImgPtr = bgImageBytes)   {
      // Make a UInt32 pointer to the byte pointer
      UInt32* bgImgIntPtr = (UInt32*)bgImgPtr;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...