![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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)
| ||