У меня есть массив байтов, который я хотел бы получить с помощью указателя 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 и как целые, так и индивидуальные цвета. Я знаю, что я могу легко конвертировать между типами, но поскольку я работаю с несколькими массивами в разных форматах, было бы намного лучше, если бы я мог получить к ним доступ напрямую, не переходя между ними все время. Существует много простого копирования, поэтому он просто добавляет накладные расходы, чтобы продолжать конвертирование.
Является bgImageBytes на самом деле 'новый байт [1000]'? или он передается неуправляемому коду? – Marlon
Только что протестировано: byte [] a = новый байт [100]; фиксированный (байт * b = a) { Int32 * c = (Int32 *) b; c [0] = 1000; } работает для меня на .NET 4. Также работает для 'UInt32'. Какую версию ты используешь? Это фактический код? –
Это чисто управляемое и инициализированное размером изображения на основе некоторых вычислений (так что 1000 на самом деле больше похоже на шаг + высота * ширина * colordepth, но это не имеет значения). –