2011-01-30 2 views
4

У меня есть массив байтов, который я хотел бы получить с помощью указателя Int32 (небезопасный контекст). Я делаю этоUnsafe 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, так и байт-указатели для одного bytearray, чтобы я мог читать «тепловую карту» Kinect и как целые, так и индивидуальные цвета. Я знаю, что я могу легко конвертировать между типами, но поскольку я работаю с несколькими массивами в разных форматах, было бы намного лучше, если бы я мог получить к ним доступ напрямую, не переходя между ними все время. Существует много простого копирования, поэтому он просто добавляет накладные расходы, чтобы продолжать конвертирование.

+0

Является bgImageBytes на самом деле 'новый байт [1000]'? или он передается неуправляемому коду? – Marlon

+0

Только что протестировано: byte [] a = новый байт [100]; фиксированный (байт * b = a) { Int32 * c = (Int32 *) b; c [0] = 1000; } работает для меня на .NET 4. Также работает для 'UInt32'. Какую версию ты используешь? Это фактический код? –

+0

Это чисто управляемое и инициализированное размером изображения на основе некоторых вычислений (так что 1000 на самом деле больше похоже на шаг + высота * ширина * colordepth, но это не имеет значения). –

ответ

6

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

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

Ответ:

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; 
    } 
}
Смежные вопросы