Вопрос такой: как можно из потока 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;
И не спрашивайте "Зачем?". Просто подскажите, возможно ли из потока перенести данные в переменную (массив, строку), и если возможно, то как?