2013-06-20 4 views
1

byte [] 배열을 스트림 (예 : 파일 업로드 용)으로 변환 한 다음 내 코드의 다른 부분에서 스트림을 배열 (예 : 파일 다운로드 용)로 다시 변환해야합니다. 바이트 배열의 복사본을 만들지 않고 이러한 작업을 수행 할 수있는 방법이 있습니까?byte []를 Stream으로 변환하고 다시 복사하지 않고 변환하는 방법이 있습니까?

이 코드 비트는 MemoryStream이 복사본을 생성 함을 보여줍니다. 나는 더 나은 메모리 성능을 위해 안전을 교환하고 싶다.

static void Main(string[] args) 
    { 
     byte[] array1 = new byte[1024]; 

     using (MemoryStream s = new MemoryStream(array1)) 
     { 
      byte[] array2 = s.ToArray(); 
      Console.WriteLine(Object.ReferenceEquals(array1, array2)); // "false" 
     } 
    } 
+2

'MemoryStream'이 복사본을 생성하지 않았다면 ToArray()가 복사본을 만드는 것을 보았습니다. 'byte [] array1 = new byte [1];을 시도하십시오. Console.WriteLine (array1 [0]); using (MemoryStream s = new MemoryStream (array1)) {s.WriteByte (1);} Console.WriteLine (array1 [0]);''0'과 '1'을 출력합니다. –

+0

좋은 지적 - 사본을 만드는 것은 ToArray()뿐입니다. – noctonura

답변

4

복사를 피하려면 MemoryStream.GetBuffer을 사용할 수 있습니다. 그것이 스트림의 개념적 길이보다 길 수있는 "기본"백업 버퍼라는 점을 명심하십시오. 당신이 시작하는 바이트 배열을 제공하는 경우

또는, 당신은 나중에 그것도 사용할 수 있습니다

byte[] buffer = new byte[1024]; 
using (MemoryStream stream = new MemoryStream(buffer)) 
{ 
    // Write to it here 
} 
// Now buffer will contain the written data 

가 다시 말하지만, 당신은 많은 데이터가 실제로 기록 된 정확히 어떻게 해결해야합니다.