Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.06.2014, 21:52
klaxwork klaxwork вне форума
Прохожий
 
Регистрация: 25.09.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
Вопрос

Вопрос такой: как можно из потока TStream данные занести в двумерный массив типа Array of Byte по 100000 байт?

К примеру, получаю потоком куски файла по 100000 байт вида
'порядковый_номер_куска#сам_кусок_файла',
общим размером 154782 байт.
Нужно, чтоб получился массив вида:
Код:
var Arr: Array of Array of Byte;
    c: Array of Integer;
begin
  Arr[0]:=тут первые 100000 байт из потока;
  c[0]:=номер куска из первых 100000 байт;
  Arr[1]:=тут оставшиеся 54782 байт из потока.
  c[1]:=номер куска из оставшихся 54782 байт;
end;

А потом все, что есть в Arr записать в файл...
Просто планирую, что буду в будущем принимать файл по кускам с порядковыми номерами пакетов.
Ну и потом надо будет все из Arr записать по порядку пакетов в файл...

Вот то, что есть у меня (тут я использую файловые потоки, но в дальнейшем буду использовать потоки из ServerSocket и ClientSocket):
Код:
procedure TForm1.Button3Click(Sender: TObject);
var FS,FD: TFileStream;
    fm, i: integer;
    Arr: array of Array of Byte;
    cnt: Integer;
begin
  FS:=TFileStream.Create('e:/1.exe',fmOpenRead); //открываем поток исходный
  i:=0; FS.Position:=i; //устанавливаем позицию на 0
  cnt:=100000; //по сколько читать из потока
  if FileExists('e:/2.exe')=False then fm:=fmCreate else fm:=fmOpenWrite; //проверяем файл на существование
  FD:=TFileStream.Create('e:/2.exe',fm); //создаем поток целевой
  while i<FS.Size do
  begin
    FS.Position:=i; //смещаем позицию исходника на следующий кусок
    if i+cnt>FS.Size then cnt:=FS.Size-i;
    FD.CopyFrom(FS,cnt); //читаем очередной кусок из исходгного потока в целевой
    i:=i+cnt; //увеличиваем счетчик считанных байт из потока
    Memo1.Lines.Add('i:='+IntToStr(i));
  end;
  //ServerSocket1.Socket.Connections[0].SendBuf();
  FS.Destroy;
  FD.Destroy;
end;

И не спрашивайте "Зачем?". Просто подскажите, возможно ли из потока перенести данные в переменную (массив, строку), и если возможно, то как?

Последний раз редактировалось M.A.D.M.A.N., 13.06.2014 в 09:23.
Ответить с цитированием
  #2  
Старый 12.06.2014, 23:13
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
function Read(var Buffer; Count: Longint): Longint;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
klaxwork (13.06.2014)
  #3  
Старый 12.06.2014, 23:48
klaxwork klaxwork вне форума
Прохожий
 
Регистрация: 25.09.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
Вопрос

Цитата:
Сообщение от NumLock
Код:
function Read(var Buffer; Count: Longint): Longint;
А можно в примере? А то я смотрю, эта функция возвращает Longint, а мне надо получить текст (бинарный текст) из потока... Плиз...

Почитал про Read и Write, а так же про ReadBuffer и WriteBuffer от TStream... Ну и, естественно, нашел несколько примеров... Спасибо за наводку!

Последний раз редактировалось klaxwork, 13.06.2014 в 02:17.
Ответить с цитированием
  #4  
Старый 13.06.2014, 06:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Эта функция возвращает кол-во прочитанных байт, если правильно помню. А вот читает она в Buffer. Пример примерно такой:
Код:
var
  A : Array [1..10000] Of Byte;
begin
  Stream.ReadBuffer(A[1],Length(A));
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
klaxwork (13.06.2014)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter