Доступ к базовому потоку памяти [для чтения] в бинарнике

У меня есть бинарная запись, которая поддерживается потоком памяти как таковым:

BinaryWriter m_binaryWriter = new BinaryWriter(new MemoryStream(BUFFER_SIZE));

Я хочу получить базовый считыватель и прочитать его в массив байтов:

long DataLength = m_binaryWriter.BaseStream.Length;
byte[] MemoryStrData = new byte[DataLength];
int BytesRead = m_binaryWriter.BaseStream.Read(MemoryStrData, 0, (int)DataLength);

Однако BytesRead всегда равен 0 (и очевидно, что MemoryStrData содержит все 0). Я попытался использовать BinaryReader для чтения потока из основного потока, но это привело к тому же самому. Я что-то упустил здесь?


person bge0    schedule 10.12.2013    source источник
comment
Вы уверены, что вам не нужен BinaryReader и не BinaryWriter.. ?   -  person Simon Whitehead    schedule 10.12.2013
comment
Да, я записываю данные в двоичный модуль записи, но мне нужен доступ к непрерывному блоку (как только он пересекает BUFFER_SIZE).   -  person bge0    schedule 10.12.2013
comment
Возможно, вам лучше реализовать собственный класс, полученный из Stream, и внедрить любую странную буферизацию/частичную фиксацию/регистрацию (что бы вы ни делали, прочитав случайный блок из потока) внутри вашего класса...   -  person Alexei Levenkov    schedule 10.12.2013


Ответы (2)


Всегда ли вы знаете, что BinaryWriter будет поддерживаться MemoryStream?

Если это так, либо сохраните ссылку на MemoryStream, либо примените BaseStream соответствующим образом, а затем используйте MemoryStream.ToArray(), чтобы получить массив байтов содержимого MemoryStream.

person Todd Bowles    schedule 10.12.2013
comment
Да, он всегда будет поддерживаться потоком памяти. Когда размер буфера достигнут, я очищаю бинарную запись и избавляюсь от бэкэнда. После этого я воссоздаю его. Я не думаю, что .ToArray() поддерживается в Compact Framework, но я могу проверить. - person bge0; 10.12.2013
comment
Согласно документации поддерживается, по крайней мере, в .NET 3.5 MemoryStream. Однако я мало что знаю о .NET Compact Framework, поэтому, пожалуйста, подтвердите, если у вас будет такая возможность. - person Todd Bowles; 10.12.2013
comment
Спасибо за предложение. В компактной структуре нет ни члена с именем .ToArray(), ни фабрики с именем MemoryStream.ToArray(). Именно по этой причине я использую .Read(). Теперь мне любопытно, нужно ли мне инициализировать мой MemoryStream массивом внутренних байтов или нет. Я знаю, что существует перегрузка с флагом bool WriteAble. Это нужно ставить? Еще одно замечание: когда я пишу на него, длина потока памяти ДЕЙСТВИТЕЛЬНО увеличивается... - person bge0; 10.12.2013
comment
Я не понимаю, почему вы не можете найти .ToArray(). В документации говорится, что он поддерживается в .NET Compact Framework 1, 2 и 3.5. - person Todd Bowles; 11.12.2013

Я решил это. Текущий индекс BinaryWriter, похоже, отличается от местоположения его внутреннего потока! Я полагал, что будет достаточно получить дескриптор базового потока, а затем выполнить .read(OutputArray,Index,Count), но вам нужно выполнить поиск самого BinaryWriter:

m_binaryWriter.Seek(0, SeekOrigin.Begin);
person bge0    schedule 10.12.2013