C# Stream в byte[]

sergnn

Собственно никогда раньше шарпом особо не интересовался, но вот понадобилось написать маленькую программку и зависнадо конвертировать System.IO.Stream в byte[]делал как в инете описано раз 10public static byte[] StreamToByteArray(Stream inputStream) { byte[] bytes = new byte[16*1024]; using (MemoryStream memoryStream = new MemoryStream()) { int count; while ((count = inputStream.Read(bytes, 0, bytes.Length)) > 0) { memoryStream.Write(bytes, 0, count); } return memoryStream.ToArray(); } }всё отрабатывается но на выходе пустой массив (входной поток inputStream.Length=1964, так на всякий случай :)) )в дебаге выясняется что inputStream.Read вообще не выполняется ни разучто я не догоняюзаранее извиняюсь если вопрос глупый, в шарпе я полный чайник, прошу тапками не кидаться
9 ответов

sergnn

Такая мысль была. Указатель там стоит на конце.Извиняюсь за чайниковский вопрос, а как перемотать?
Как вариант
inputStream.Peremotka(v_nachalo);


sergnn

sergnn,
/// <span><<span>summary</span>></span> /// Возвращает из стрима все байты /// <span><<span>/</span><span>summary</span>></span> /// <span><<span>param</span> <span>name</span><span>=</span><span>"stream"</span>><<span>/</span><span>param</span>></span> /// <span><<span>returns</span>><<span>/</span><span>returns</span>></span> public static byte[] ToBytes(this Stream stream) { if (stream.CanSeek) stream.Position = 0; var bufferLen = (int)stream.Length; var buffer = new byte[bufferLen]; stream.Read(buffer, 0, bufferLen); return buffer; }


sergnn

Извиняюсь, вот так лучше выглядит:
public static byte[] StreamToByteArray(Stream inputStream) { byte[] bytes = new byte[16*1024]; using (MemoryStream memoryStream = new MemoryStream()) { int count; while ((count = inputStream.Read(bytes, 0, bytes.Length)) > 0) { memoryStream.Write(bytes, 0, count); } return memoryStream.ToArray(); } }


sergnn

а inputStream в начало "перемотан"?


sergnn

для чтения потока в байтовый массив можно использовать BinaryReader, размер массива\потока нужно знать заранее, так как поток не гарантирует то, что размер будет известен


sergnn

а inputStream в начало "перемотан"?
Такая мысль была. Указатель там стоит на конце.Извиняюсь за чайниковский вопрос, а как перемотать?


sergnn

sergnn,Stream.Seek()https://msdn.microsoft.com/ru-ru/library/system.io.stream.seek(v=vs.110).aspxНе все потоки поддерживают seek, вроде у Stream есть еще свойство CanSeek


sergnn

Roman Mejtes, спасибо. Помогло.