Как преобразовать байтовый массив в массив UInt32? - PullRequest
6 голосов
/ 03 сентября 2011

Допустим, в C ++ я получил код, похожий на этот ..

void * target
uint32 * decPacket = (uint32 *)target;

Так что в C # это было бы как ..

byte[] target;
UInt32[] decPacket = (UInt32[])target;

Невозможно преобразовать байт типа []в uint []

Как преобразовать эту функцию выравнивания памяти, которую делает C ++, в массивы в C #?

Ответы [ 5 ]

12 голосов
/ 03 сентября 2011

Ну, что-то близкое было бы использовать Buffer.BlockCopy:

uint[] decoded = new uint[target.Length / 4];
Buffer.BlockCopy(target, 0, decoded, 0, target.Length);

Обратите внимание, что последний аргумент BlockCopy равен всегда количество копируемых байтов, независимо от типов, которые вы копируете.

Вы не можете просто обрабатывать массив byte как массив uint в C # (по крайней мере, не в безопасном коде; я не знаю об этом в небезопасном коде) - но Buffer.BlockCopy будет разбивать содержимое массив byte в массив uint ... оставляя результаты, которые будут определены на основе порядкового номера системы. Лично я не фанат этого подхода - он оставляет код довольно склонным к ошибкам при переходе на систему с другим расположением памяти. Я предпочитаю быть явным в моем протоколе. Надеюсь, это поможет вам в этом случае.

2 голосов
/ 12 марта 2012

Вы можете иметь торт (избегать распределения) и есть его тоже (избегать итераций), если вы хотите перейти на темную сторону.

Проверьте мой ответ насвязанный вопрос, в котором я демонстрирую, как преобразовать float [] в byte [] и наоборот: Какой самый быстрый способ преобразовать float [] в байт []?

1 голос
/ 03 сентября 2011

Как упоминал Джон , Buffer.BlockCopy будет хорошо работать для копирования этого.

Однако, если это сценарий взаимодействия, и вы хотите получить доступ к байтовому массиву напрямую как uint[], наиболее близким к подходу C ++ будет использование небезопасного кода:

byte[] target;
CallInteropMethod(ref target);

fixed(byte* t = target)
{
   uint* decPacket = (uint*)t;

   // You can use decPacket here the same way you do in C++
}

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

0 голосов
/ 03 сентября 2011

Обведите все элементы массива и вызовите Convert.ToUint32 () для каждого из них. Здесь :

 Uint32[] res = new Uint32[target.Length];
 for(int i = 0;i <= target.Length;i++) 
 {
     res[i] = Convert.ToUint32(target[i]);
 }

Вот официальная ссылка от MSDN. http://msdn.microsoft.com/en-us/library/469cwstk.aspx

0 голосов
/ 03 сентября 2011

Вы можете использовать Buffer.BlockCopy.Вместо Array.Copy, BlockCopy выполняет копирование на уровне байтов без проверки совместимости типов массивов.

Примерно так:

uint[] array = new uint[bytes.Length/4];
Buffer.BlockCopy(bytes, 0, array, 0, bytes.Length);
...