Я пытаюсь получить массив байтов из TMemoryStream. Я изо всех сил пытаюсь понять, как работает поток памяти. Насколько я понимаю, я должен просто иметь возможность перебирать MemoryStream, используя свойства Position
и Size
.
Мой ожидаемый результат состоит в том, чтобы заполнить массив байтов, циклически проходящих через поток памяти, однако при настройке свойства Position
потока памяти он переходит от примера 0 к 2, а затем от 2 к 6.
Data.Position := 0;
repeat
SetLength(arrBytes, Length(arrBytes) + 1);
Data.Read(arrBytes[High(arrBytes)], Data.Size);
Data.Position := Data.Position + 1;
until (Data.Position >= Data.Size -1);
Приведенный выше код приводит к частичному или, в некоторых случаях, к полному отсутствию данных. Как я могу правильно преобразовать данные из потока памяти в массив байтов
@ Брайан Если я уберу Data.Position := Data.Position + 1;
и отлажу его, я увижу, что позиция не меняется, а остается на 0, создавая бесконечный цикл. Есть ли что-то еще, что я, возможно, делаю неправильно?
Data.Read(arrBytes[High(arrBytes)], Data.Size);
пытается уместить 1561563 байта (скажем) в один байт. Наверное, вы хотите Data.Read(arrBytes[High(arrBytes)], 1);
и нет Data.Position := Data.Position + 1
. Но это крайне медленный и неэффективный подход.
При чтении данных из TMemoryStream
или любого другого потока позиция автоматически увеличивается на количество прочитанных байтов.
Из документации TMemoryStream.Read
Считывает до Count байтов из потока памяти в буфер и продвигает текущую позицию потока на количество байтов читать.
Поэтому, если вы читаете данные из TMemoryStream
последовательно, вам не нужно самостоятельно менять позицию в памяти, так как это делается автоматически.
Это было так, но только когда TBytes
используется в качестве массива. При использовании TArray<Byte>
или array of Byte
кажется, что автоинкремент не работает, потому что байты не читаются. Я всегда думал, что эти 3 типа массивов одинаковы, но, похоже, это не так. Мне нужно больше исследовать байты.
Чтение перемещает позицию в потоке.