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, спасибо. Помогло.