2011-11-18 45 views
0

我有一個關閉的MemoryStream的實例(不要問,不能改變這一點,它不是那麼糟糕的設計,因爲它似乎乍一看:)。 無論如何,我發現我可以使用的東西走的byte [],如:從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

當然,內存流可以包含一個零!無論你是否可以完全依賴它所包含的數據,因此這個問題是無法回答的。 – Amy

+0

無論如何,我需要對您的評論進行評論,正如您所看到的,其他人提出的方法實際上使我的擔憂無效。 –

回答

3

嘗試ms.ToArray()http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray.aspx

它可以在一個封閉的流並返回數據的副本,沒有未使用緩衝區的一部分。

+0

謝謝! 我的恥辱我甚至沒有嘗試過。我只是覺得ToArray()需要知道MemoryStream的長度才能接收字節。它顯然沒有:)。 或者也許它做到了,但自從MemoryStream具有專用_length字段即使在流關閉後也保持正確。 無論如何,謝謝指出! –

3

msdn article on MemoryStream.GetBuffer Method

注意,緩衝區包含分配的字節,這可能是未使用的。 例如,如果將字符串「test」寫入到MemoryStream 對象中,則從GetBuffer返回的緩衝區的長度爲256,而不是 4,未使用252個字節。要僅獲取緩衝區中的數據,請使用ToArray方法 ;但是,ToArray會在內存中創建數據的副本。

儘管它看起來像你應該做的副本...

+0

謝謝你的回答,jsobo。 我讀了msdn上的文章,我剛剛將ToArray()方法從拼圖中移開(甚至沒有嘗試它,因爲它覺得它需要Length屬性,當Stream被關閉時,我知道拋出異常)。 正如尼古拉斯·巴特勒建議使用ToArray()並指出這將與封閉流一起工作,我標記了他的答案,同時我還是會讚揚你的答案,因爲它仍然有幫助。 謝謝! –