C #에서 struct System.Byte byte []를 System.IO.Stream 객체로 어떻게 변환합니까?


답변:


1284

바이트 배열을 스트림으로 변환하는 가장 쉬운 방법은 MemoryStream클래스를 사용하는 것 입니다.

Stream stream = new MemoryStream(byteArray);

19
"이 생성자는 기본 스트림을 노출하지 않습니다. GetBuffer에서 UnauthorizedAccessException이 발생합니다." msdn.microsoft.com/ko-kr/library/e55f3s5k.aspx
noocyte

25
@ noocyte 그렇다면 이상적인 방법은 무엇입니까?
developerbmw

6
그러나 stream.ToArray()바이트 배열을 다시 원한다면 여전히 사용할 수 있습니다 .
Florian Fida

2
이와 같이 바이트 배열에서 스트림을 구성 할 때 어떤 종류의 오버 헤드가 발생합니까? 메모리 사용량은 주로 내가 궁금해하는 것입니다.
jocull

344

당신은 MemoryStream.Write방법을 찾고 있습니다.

예를 들어 다음 코드는 byte[]배열 의 내용을 메모리 스트림에 씁니다.

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream();
stream.Write(myByteArray, 0, myByteArray.Length);

또는 바이트 배열을 기반으로 크기를 조정할 수없는 MemoryStream 객체를 만들있습니다 .

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);

26
이것이 가장 좋은 대답입니다. 간결하고 모든 실제 응용 프로그램을 포괄합니다. 여기에 표시된대로 바이트 배열 기반 생성자를 사용하는 문제가 있습니다. 결과 스트림의 크기를 조정할 수 없습니다.
Jduv

17
또한 나중에 스트림을 재설정해야합니다. stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen

첫 번째 옵션 MemoryStream.Write은 훨씬 더 많은 메모리를 소비합니다.new MemoryStream(myByteArray)
Alex

왜 정확히 @jitbit입니까? 그것은이었다 많은 내가 어떤 .NET을 한 이후 성능에 대한 의견이 대답을 업데이트하려고한다면 그래서, 내가 좀 더 정보가 필요 것, 년.
코디 그레이

2
MemoryStream기본적으로 버퍼에 추가 공간이 할당됩니다 (예 : 목록과 동일). 용량을 설정할 수있는 오버로드를 사용하여 쉽게 처리 할 수 ​​있지만 스트림에 데이터를 쓰지 않을 것으로 예상되는 경우 (또는 필요한 추가 바이트 수를 알고있는 경우에만) 실제로 유용합니다 ). 그러나 jitbit이 byte[]생성자 를 사용할 때 배열이 복사되지 않는다는 사실을 언급 할 수 있다고 생각합니다 MemoryStream. 인수에서 배열을 나타냅니다. 이것은 좋고 나쁠 수 있으며, MSDN에 문서화되어 있지 않은 것은 부끄러운 일입니다. :)
Luaan

32

모든 스트림에 쓰는 일반적인 접근 방식 MemoryStream은 다음을 사용하는 것입니다 BinaryWriter.

static void Write(Stream s, Byte[] bytes)
{
    using (var writer = new BinaryWriter(s))
    {
        writer.Write(bytes);
    }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.