TMemoryStream в массив байтов

Я пытаюсь получить массив байтов из 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);

Приведенный выше код приводит к частичному или, в некоторых случаях, к полному отсутствию данных. Как я могу правильно преобразовать данные из потока памяти в массив байтов

Чтение перемещает позицию в потоке.

Brian 12.11.2022 13:14

@ Брайан Если я уберу Data.Position := Data.Position + 1; и отлажу его, я увижу, что позиция не меняется, а остается на 0, создавая бесконечный цикл. Есть ли что-то еще, что я, возможно, делаю неправильно?

Adriaan 12.11.2022 13:39
Data.Read(arrBytes[High(arrBytes)], Data.Size); пытается уместить 1561563 байта (скажем) в один байт. Наверное, вы хотите Data.Read(arrBytes[High(arrBytes)], 1); и нет Data.Position := Data.Position + 1. Но это крайне медленный и неэффективный подход.
Andreas Rejbrand 12.11.2022 19:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
143
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При чтении данных из TMemoryStream или любого другого потока позиция автоматически увеличивается на количество прочитанных байтов.

Из документации TMemoryStream.Read

Считывает до Count байтов из потока памяти в буфер и продвигает текущую позицию потока на количество байтов читать.

Поэтому, если вы читаете данные из TMemoryStream последовательно, вам не нужно самостоятельно менять позицию в памяти, так как это делается автоматически.

Это было так, но только когда TBytes используется в качестве массива. При использовании TArray<Byte> или array of Byte кажется, что автоинкремент не работает, потому что байты не читаются. Я всегда думал, что эти 3 типа массивов одинаковы, но, похоже, это не так. Мне нужно больше исследовать байты.

Adriaan 12.11.2022 15:30

Другие вопросы по теме