Как прочитать управляемый поток в массив Uint непосредственно в C#?
У меня есть некоторые данные в потоке, который на самом деле в формате UINT. System.IO.Stream позволяет только считывать содержимое в байтовый массив, но я не хочу читать байты, а затем преобразовывать их в массив uint с 1/4 длины байтового массива. Я хочу прочитать его прямо в память массива uint, чтобы сэкономить время.
Если это в неуправляемом C++, это так просто. Просто отправьте указатель на массив uint, и все будет сделано. Но в C# это не так просто. Я пытаюсь создать байтовый массив с тем же адресом памяти, что и другой массив uint, а затем отправить байтовый массив в качестве параметра Stream.Read(), чтобы при записи Stream.Read() в байтовый массив содержимое просто в массиве uint. Но я посмотрел на класс Маршалла и до сих пор не нашел решения этой проблемы. Есть идеи?
2 ответа
List<UInt32> array = new List<UInt32>();
System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
while(stream.Position < stream.Length)
array.Add(reader.ReadUInt32());
Обратите внимание, что некоторые реализации потоков не поддерживают свойства Position и / или Length.
Я думаю (да, это еще один из тех ленивых постов с предложением типа, лишенных кода на sa, которые люди публикуют в попытке получить повтор в свои свободные 5 минут), вы можете использовать ту же технику в C#, используя unsafe
ключевое слово - позволяет связываться с указателями и получать доступ к памяти как есть.
Конечно, в зависимости от ваших данных, я бы порекомендовал сделать это более медленным и неэффективным способом - небезопасный код не так уж и хорош - вам нужна дополнительная безопасность и время для тестирования.