Как преобразовать массив байтов в массив UInt32?


Допустим, в C++ у меня есть такой код..

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

Так что в C# это было бы похоже..

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

Не удается преобразовать тип byte[] в uint []

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

5 6

5 ответов:

Ну, что-то близкое было бы использовать 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... оставляя результаты для определения на основе endianness системы. Лично я не поклонник этого подхода - он оставляет код довольно склонным к ошибкам при переходе к системе с другим расположением памяти. Я предпочитаю быть откровенным в своем протоколе. Надеюсь, что это поможет вам в этом случае.

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

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

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

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

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++
}
Я лично предпочитаю делать копию, но если вам нужно избежать фактического копирования данных, это позволит вам работать (в небезопасном контексте).

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

Вот так:

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

Цикл по всем элементам массива и вызов 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