Если вы пишете небезопасный код, вы можете исправить массив в памяти, получить указатель на его начало и привести этот указатель.
unsafe
{
fixed(int* pi=arr)
{
byte* pb=(byte*)pi;
...
}
}
Массив в .net имеет префикс с количеством элементов, поэтому вы не можете безопасно конвертировать между int[]
и byte[]
, которые указывают на одни и те же данные.Вы можете приводить между uint[]
и int[]
(по крайней мере, в отношении .net поддержка этой функции в самом C # немного противоречива).
Существуеттакже трюк на основе объединения для переинтерпретации ссылок приведения, но я настоятельно рекомендую , а не , используя его.
Обычный способ получить отдельные целые числа из байтового массива в порядке с прямым порядком байтов:BitConverter
, но это относительно медленно.Ручной код часто быстрее.И, конечно, он не поддерживает обратное преобразование.
Один из способов ручного преобразования, предполагая младший порядок (при моем i3 с частотой 2,6 ГГц, около 400 миллионов операций чтения в секунду):
byte GetByte(int[] arr, int index)
{
uint elem=(uint)arr[index>>2];
return (byte)(elem>>( (index&3)* 8));
}
Я рекомендую писать код вручную, который использует сдвиг битов для доступа к отдельным байтам, если вы хотите использовать управляемый код, и указатели, если вы хотите получить последний бит производительности.
Вам также нужно быть осторожным с проблемами порядка байтов.Некоторые из этих методов поддерживают только собственный порядок байтов.