Безопасно ли получать выделенные байты только из байтового массива, полученного из GetBuffer? - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть экземпляр MemoryStream, который закрыт (не спрашивайте, не могу это изменить, и это не настолько плохой дизайн, как кажется на первый взгляд :).Как бы то ни было, я обнаружил, что могу взять байт [], используя что-то вроде:

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.

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Попробуйте ms.ToArray(): http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray.aspx

Работает в закрытом потоке и возвращает копию данных без неиспользуемой части буфера.

3 голосов
/ 18 ноября 2011

Статья msdn о методе MemoryStream.GetBuffer говорит

Обратите внимание, что буфер содержит выделенные байты, которые могут быть не использованы. Например, если строка «test» записана в MemoryStream объект, длина буфера, возвращаемого из GetBuffer, составляет 256, а не 4, с 252 байтами неиспользованными. Чтобы получить только данные в буфере, используйте метод ToArray; однако ToArray создает копию данных в память.

Несмотря на копию, похоже, что вы должны делать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...