Почему этот простой эксперимент MemoryStream.Write () не удался? - PullRequest
0 голосов
/ 04 октября 2018

Я сбит с толку базовым экспериментом, использующим записываемый System.IO.MemoryStream на основе байтового массива, дающего ArgumentException

  1. Массив newBytes инициализируется литералом
  2. поток памяти ms инициализируется с помощью массива, а флаг записи установлен в True
  3. Поток памяти записывается одним байтом в позиции 1

VB.net

Try
    Dim newBytes() As Byte = {0, 128, 255, 128, 0}
    Dim ms As New System.IO.MemoryStream(newBytes, True)
    ms.Write({CByte(4)}, 1, 1)
Catch ex as Exception
End Try

C # .net

try
    byte() newBytes = {0, 128, 255, 128, 0};
    System.IO.MemoryStream ms = new System.IO.MemoryStream(newBytes, true);
    ms.Write(byte(4), 1, 1);
catch Exception ex
end try

Исключением является ArgumentException с текстом "Смещение и длина вышли за пределы массива или число превышает числоэлементы от индекса до конца исходной коллекции. "

Очевидно, что поток памяти имеет Length: 5, и запись одного байта в позицию 1 должна быть вполне выполнимой, почему существует исключение?

1 Ответ

0 голосов
/ 04 октября 2018

Метод MemoryStream.Write имеет три параметра:

  • buffer - буфер для записи данных из
  • offset - смещение байтов на основе нуля в буфере прис которого начать копирование байтов в текущий поток
  • count - максимальное количество байтов для записи

Обратите внимание, что вторым параметром является смещение во входном массиве, а несмещение в выходном массиве.Свойство MemoryStream.Position определяет текущее смещение в выходных данных.

...