Форум по 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.
Ответить с цитированием
 


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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