|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Вопрос такой: как можно из потока 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
|
||||
|
||||
Код:
function Read(var Buffer; Count: Longint): Longint; Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
klaxwork (13.06.2014)
|
#3
|
|||
|
|||
Цитата:
Почитал про Read и Write, а так же про ReadBuffer и WriteBuffer от TStream... Ну и, естественно, нашел несколько примеров... Спасибо за наводку! Последний раз редактировалось klaxwork, 13.06.2014 в 02:17. |
#4
|
|||
|
|||
Эта функция возвращает кол-во прочитанных байт, если правильно помню. А вот читает она в Buffer. Пример примерно такой:
Код:
var A : Array [1..10000] Of Byte; begin Stream.ReadBuffer(A[1],Length(A)); |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
klaxwork (13.06.2014)
|