2011-11-18 63 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()并指出这将与封闭流一起工作,我标记了他的答案,同时我还是会赞扬你的答案,因为它仍然有帮助。 谢谢! –