Преобразовать байт [,] в байт [] - PullRequest
1 голос
/ 13 января 2011

Кто-нибудь знает эффективный способ сгладить двумерный массив (не зубчатый) в C # к 1d и обратно.Я знаю, что во внутреннем интерфейсе C # должен держаться за него как за 1d-массивом. Я просто хотел бы получить дескриптор на 1d-массиве, если это вообще возможно.

Причина, по которой я хотел бы сделать это,потому что я хотел бы иметь возможность в управляемом коде иметь его как 2d, иногда я хотел бы передать его как 1d неуправляемому импортированному dll-коду (хороший пример - оптимизированная сборка при обработке цифровых изображений).

Ответы [ 4 ]

11 голосов
/ 13 января 2011

Ну, сам объект не является byte[], даже если он сам содержит данные в одном непрерывном блоке памяти.Не забывайте, что массив также знает свои ранги, длины и т. Д.

Однако вы можете использовать Buffer.BlockCopy для быстрого копирования массива.Например:

byte[,] source = new byte[5,5];
byte[] dest = new byte[source.Length];
Buffer.BlockCopy(source, 0, dest, 0, source.Length);

Обратите внимание, что последний аргумент - это число байтов , а не количество элементов массива.

3 голосов
/ 13 января 2011

Вы не можете получить управляемый массив byte[] из byte[,], не копируя его (во всяком случае, я не знаю).

Если вас устраивает код unsafeможно исправить byte* на массиве, и я считаю, что должно работать:

fixed (byte* ptr = array)
{
    for (int i = 0; i < N; ++i)
    {
        byte b = ptr[i];
        // Do whatever you need.
    }
}
3 голосов
/ 13 января 2011

Чтобы перейти от 2D-индекса к 1D-индексу:

int i = y * width + x;

и обратно:

int x = i % width;
int y = i / width;

Тогда самое простое - просто перебрать массив, копируя значения по одному.

0 голосов
/ 13 января 2011
var myFlattenedByteArray = my2DByteArray.SelectMany(b=>b).ToArray();

Это вернет каждый элемент каждого подмассива двумерного байтового массива в порядке подэлементного элемента: myFlatteredByteArray [1] == my2DByteArray [0] [1]. Вероятно, есть более производительные или эффективные решения (особенно сплит Enumerable, созданный SelectMany в свой собственный массив), но это одна строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...