2011-11-18 2 views
0

나는 닫혀있는 MemoryStream의 인스턴스를 가지고있다. (묻지 말고, 변경할 수없고, 언뜻보기에는 그렇게 열악한 디자인이 아니다. :)할당 된 바이트 만 GetBuffer에서 가져온 바이트 배열로 가져 오는 것이 안전합니까?

MemoryStream ms = SomeClass.GetMemoryStream(); 
byte[] myData = ms.GetBuffer(); 

모두 지금까지 정말 대단해 보인다 내가 가진 유일한 문제는 바이트 배열의 크기를 조정할 GetBuffer()에서 반환 및 할당되지 않은 포함되어 있습니다 : 어쨌든 내가 좋아하는 뭔가를 사용하여 바이트 []를 취할 수 있다는 것을 발견 공간 (바이트) 0; 과 같이 :

12,32,43,43,2,3,0,0,0,0,0,0,0 

내 문제는 내가 처음 0 발생할 때까지 배열을 읽을 수 있다고 가정하는 것이 안전합니다? 데이터 중간에 (바이트) 0이있을 경우를 알고 계십니까? 데이터는 MIME 전자 메일 메시지입니다.

+3

물론 메모리 스트림에는 0이 포함될 수 있습니다! 귀하의 정보가 포함 된 데이터에 전적으로 의존 할 수 있는지 여부와 상관없이이 질문은 답할 수 없습니다. – Amy

+0

어쨌든, 당신이 볼 수 있듯이, 다른 사람들이 내 관심사를 실제로 무효화한 방법을 제안했습니다. –

답변

3

ms.ToArray()보십시오 : http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray.aspx

그것은 사용되지 않는없이, 폐쇄 스트림에서 작동하며 데이터의 사본을 반환 버퍼의 일부.

+0

고마워요! 나의 수치심 나는 ​​그것을 시도조차하지 않았다. 방금 바이트를 받기 위해 ToArray()가 MemoryStream의 길이를 알아야한다고 생각했습니다. 그것은 분명히하지 않았다 :). 또는 MemoryStream이 스트림을 닫은 후에도 올바르게 유지되는 private _length 필드를 가지고 있기 때문에 발생했을 수도 있습니다. 어쨌든 그것을 지적 해 주셔서 감사합니다! –

3

msdn article on MemoryStream.GetBuffer Method은 버퍼가 사용하지 못할 수 있습니다 할당 된 바이트를 포함

주를 말한다. 예를 들어 문자열 "test"가 MemoryStream 개체에 기록 된 경우 GetBuffer에서 반환 된 버퍼의 길이는 이 아닌 256이며 사용되지 않은 바이트는 252 바이트입니다. 버퍼의 데이터 만 얻으려면 ToArray 메서드를 사용하십시오. 그러나 ToArray는 메모리에 데이터 복사본을 만듭니다. 당신은 어떻게해야 무엇처럼 보이는 사본에도 불구하고

...

+0

답변 해 주셔서 감사합니다. jsobo. msdn에서 기사를 읽었는데 방금 ToArray() 메서드를 퍼즐에서 멀리 이동했습니다 (스트림 속성이 닫혀있을 때 예외가 발생하는 것으로 알고있는 Length 속성이 필요하다고 느껴짐없이 시도해 보지도 않았습니다). Nicholas Butler가 ToArray()를 사용하도록 제안했으며 폐쇄 형 스트림에서 작동 할 것이라고 지적하면서 응답을 표시했지만 나는 여전히 도움이되므로 회신합니다. 감사합니다. –

관련 문제