Как преобразовать массив байтов в массив UInt32?
Допустим, в C++ у меня есть такой код..
void * target
uint32 * decPacket = (uint32 *)target;
Так что в C# это было бы похоже..
byte[] target;
UInt32[] decPacket = (UInt32[])target;
Не удается преобразовать тип byte[] в uint []
Как мне преобразовать эту выравнивающую память вещь, которую C++ делает с массивами, в C#?
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