Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246

Как из потока передать в переменную типа Byte?

12.06.2014, 22:05. Показов 3432. Ответов 16
Метки нет (Все метки)

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

К примеру, получаю потоком куски файла по 100000 байт вида
'порядковый_номер_куска#сам_кусок_файла' ,
общим размером 154782 байт.
Нужно, чтоб получился массив вида:
Delphi
1
2
3
4
5
6
7
8
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):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.06.2014, 22:05
Ответы с готовыми решениями:

Как перевести byte[] или переменную типа IntPtr к типу byte[] (ассемблерные инструкции)?
Наткнулась на проблему, нужно перевести тип IntPtr в массив ассемблерной инструкции. Вот пример кода, который нужно справить: ...

как отослать переменную типа byte по сети
как отослать переменную типа byte по сети. Пробовал WriteSmallInt, но она посылает 2 байта

Как передать из ACCESS переменную STRING в переменную окружения (типа CMD команды SET=)
Добрый день! Подскажите как установить переменную окружения из ACCESS. Допустим у меня есть переменная CurrentDir типа String и я хочу...

16
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
12.06.2014, 22:19
прежде чем отвечать на вопрос, опытные люди спрашивают, зачем...)))
думаю, как раз тот случай
почему из потоков не писать в файл?
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
12.06.2014, 23:01  [ТС]
krapotkin, может быть я буду передавать текст больших размеров для того, чтоб парсить по кускам?
А может буду писать свою версию торрента?
Какая разница зачем я это прошу? Если я это прошу, значит МНЕ это НАДО... Согласен?
К тому же возможно буду буду это использовать в многопоточном клиент-серверном приложении для разграничения кусков по принадлежности к файлам...

И остальным: Не спрашивайте "Зачем?". Лучше скажите, возможно это или нет? Если возможно, то как?
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
12.06.2014, 23:14
Цитата Сообщение от klaxwork Посмотреть сообщение
Delphi
1
Arr[0]:=тут первые 100000 байт из потока; c[0]:=номер куска из первых 100000 байт; Arr[1]:=тут оставшиеся 54782 байт из потока. c[1]:=номер куска из оставшихся 54782 байт;
тупой вопрос, а получится ли разобрать оставшиеся данные?
просто читать если файл, нужно читать его по определенной схеме.. иначе данные могут быть просто испорчены если разрезать его на произвольные куски, если резать - то и резать по схеме, чтобы разрез был на границе между одними данными и другими, просто тупо скажем, есть данное 4 байта длиной, и получилось так что мы взяли из файла кусок и это данное разрещалось на 3 и 1 часть, тут будет не просто восстановить порезанное данное
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
12.06.2014, 23:32  [ТС]
Цитата Сообщение от Arcor Посмотреть сообщение
есть данное 4 байта длиной, и получилось так что мы взяли из файла кусок и это данное разрещалось на 3 и 1 часть, тут будет не просто восстановить порезанное данное
Я говорил, что эти куски будут пронумерованы?
По-моему да:
Delphi
1
2
3
4
5
6
begin
  Arr[0]:=тут первые 100000 байт из потока;
  c[0]:=номер куска из первых 100000 байт;
  Arr[1]:=тут оставшиеся 54782 байт из потока.
  c[1]:=номер куска из оставшихся 54782 байт;
end;
Или, если переиначить на ваш пример с четырьмя байтами:
Delphi
1
2
3
4
5
6
begin
  Arr[0]:=тут первые 3 байт из потока;
  c[0]:=номер куска из первых 3 байт;
  Arr[1]:=тут оставшийся 1 байт из потока.
  c[1]:=номер куска из оставшегося 1 байта;
end;
Естественно я буду передавать сначала номер куска с каким-либо разделителем (можно поставить # или точку), затем уже сам кусок.
И повторяю:
Цитата Сообщение от klaxwork Посмотреть сообщение
Ну и потом надо будет все из Arr записать по порядку пакетов в файл...
А может быть и не в файл, а еще куда-нить передать.

Добавлено через 2 минуты
И опять же повторяю: не спрашивайте "зачем?"! Если не знаете как, то молчите. Знаете -- помогите.
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
12.06.2014, 23:36
Цитата Сообщение от klaxwork Посмотреть сообщение
Я говорил, что эти куски будут пронумерованы?
По-моему да:
Код Delphi
1
2
3
4
5
6
begin
Arr[0]:=тут первые 100000 байт из потока;
c[0]:=номер куска из первых 100000 байт;
Arr[1]:=тут оставшиеся 54782 байт из потока.
c[1]:=номер куска из оставшихся 54782 байт;
end;
Или, если переиначить на ваш пример с четырьмя байтами:
Код Delphi
1
2
3
4
5
6
begin
Arr[0]:=тут первые 3 байт из потока;
c[0]:=номер куска из первых 3 байт;
Arr[1]:=тут оставшийся 1 байт из потока.
c[1]:=номер куска из оставшегося 1 байта;
end;
Естественно я буду передавать сначала номер куска с каким-либо разделителем (можно поставить # или точку), затем уже сам кусок.
Ну Ну, удачи в программировании..

Добавлено через 1 минуту
Цитата Сообщение от klaxwork Посмотреть сообщение
И опять же повторяю: не спрашивайте "зачем?"! Если не знаете как, то молчите. Знаете -- помогите.
и опять же повторим, если не понимаешь - не спрашивай как
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
12.06.2014, 23:45
Цитата Сообщение от klaxwork Посмотреть сообщение
Если я это прошу, значит МНЕ это НАДО... Согласен?
нет, не согласен
тут же как - если сам умный - зачем спрашивать, взял да сделал.
Кто же мешает ТЕБЕ в документацию глянуть и найти у TStream метод WriteBuffer и ReadBuffer
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type
  TItem = Integer;
  TItemArray = array of TItem;
 
var
  Stream: TStream;
  Arr: TItemArray;
  L: LongWord;
 
begin
  Arr:= TItemArray.Create(1, 2, 3);
// To save
  Stream:= TFileStream.Create('C:\Temp\test.bin', fmCreate);
  L:= Length(Arr);
  Stream.WriteBuffer(L, SizeOf(L));
  Stream.WriteBuffer(Pointer(Arr)^, L * SizeOf(TItem));
  Stream.Free;
// To load
  Stream:= TFileStream.Create('C:\Temp\test.bin', fmOpenRead);
  Stream.ReadBuffer(L, SizeOf(L));
  SetLength(Arr, L);
  Stream.ReadBuffer(Pointer(Arr)^, L * SizeOf(TItem));
  Stream.Free;
end;

Но люди-то подозревают, что мало осталось неизобретенных велосипедов, (а предложенный метод очень подозрительно похож на него) и для ТВОЕЙ же пользы просят поподробнее обрисовать задачу.

Не по теме:

От души советую попридержать коней...

1
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
12.06.2014, 23:49  [ТС]
Arcor, а ты не мог бы пояснить, чтоб я понял?
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
12.06.2014, 23:51
Цитата Сообщение от klaxwork Посмотреть сообщение
Arcor, а ты не мог бы пояснить, чтоб я понял?
я не знаю с какого уровня начинать пояснять, я не знаю, что ты знаешь о данных, чтобы оценить откуда начать, может я сам не настолько умен оО
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
13.06.2014, 00:01  [ТС]
krapotkin, спасибо за пример. +1 спасибо!
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
13.06.2014, 00:16
Цитата Сообщение от klaxwork Посмотреть сообщение
как можно из потока TStream данные занести в двумерный массив типа Array of Byte по 100000 байт?
так в байт влазит максимально двести пятьдесят шесть значений, а тут целых сто тысяч
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
13.06.2014, 01:43  [ТС]
Arcor, ты ведь уже придираешься к мелочам, не так ли?
Массив можно сделать и из строк (Array of String). Ну или из массивов Array of Byte. Это я образно.
А точнее Array of Array of Byte. В общем тут тоже можно подумать, как сделать, чтоб и памяти не особо отжирало, и места хватало...
Мне нужно было главное: принцип действий!.. А остальное можно и при тестах выявить.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
13.06.2014, 02:20
Цитата Сообщение от klaxwork Посмотреть сообщение
Arcor, ты ведь уже придираешься к мелочам, не так ли?
Массив можно сделать и из строк (Array of String). Ну или из массивов Array of Byte. Это я образно.
А точнее Array of Array of Byte.
А вот в Array of Array of Byte ты хрен что либо запишешь функцией типа WriteBufxxx и хрен что прочитаешь функцией типа ReadBufxxx.
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
13.06.2014, 02:38  [ТС]
northener, Не в этом суть. Тип данных можно подобрать потом. Мне главное, чтоб можно было как-то распарсить то, что я получаю из потока или передаю в поток.
А точнее, чтоб можно было из потока занести данные в строку, распарсить их и внести в какой-либо массив для дальнейших хранения и обработки.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
13.06.2014, 02:51
Цитата Сообщение от klaxwork Посмотреть сообщение
northener, Не в этом суть.
А в чем?
Ты же суть так и не представил до сих пор. Представил только "мысли идиота". Не обижайся, но так это и выглядит со стороны.
0
17 / 17 / 3
Регистрация: 28.05.2013
Сообщений: 246
13.06.2014, 11:51  [ТС]
northener, суть в том, чтоб я мог получить строку из потока. А уж потом запихать ее в массив строк или байт -- дело второстепенное.
Пока я решил это дело так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.Button3Click(Sender: TObject);
var FS: TFileStream;
    Arr: Array of String;
    cnt: Integer;
begin
  FS:=TFileStream.Create('e:/1.txt',fmOpenRead);
  Memo1.Lines.Add('Size:='+IntToStr(FS.Size));
  i:=0; //начальное смещение
  cnt:=7; //по сколько читать из потока
  SetLength(Arr,0);
  repeat
    FS.Position:=i;
    if cnt+i>FS.Size then cnt:=FS.Size-i;
    SetLength(Arr,Length(Arr)+1);
    SetLength(Arr[High(Arr)],cnt);
    FS.ReadBuffer(Pointer(Arr[High(Arr)])^,cnt);
    Memo1.Lines.Add('Arr['+IntToStr(High(Arr))+']:='+Arr[High(Arr)]);
    i:=i+cnt;
  until FS.Position>=FS.Size;
  FS.Free;
end;
И еще один небольшой вопросик: чем отличается FS.Free от FS.Destroy?
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
13.06.2014, 20:07
Цитата Сообщение от klaxwork Посмотреть сообщение
Arcor, ты ведь уже придираешься к мелочам, не так ли?
Массив можно сделать и из строк (Array of String). Ну или из массивов Array of Byte. Это я образно.
Я? Придераюсь? Ты сам не можешь определиться, что ты хочешь, ты с байтами собрался работать? или с готовыми типами данных? которые занимают уже некое кол-во байт, тебе что байт что стринг видать без разницы...,ты сам не понимаешь, что ты сделать хочешь, а нам орешь что мы не понимаем и заткнуться лучше должны. Тут конечно есть люди которые не в теме, но очень много таких, которые именно разбираются во всем этом и просят тебя дать больше информации что ты хочешь сделать, а ты явно сам не понимаешь, что ты хочешь. при чем тут разделители размеров? при чем тут точки или решетки как разделители? где они? если ты работаешь через потоки данных, то ты работаешь уже с определенной структурой данных которую нельзя просто так взять да порезать где захотел, нет, конечно, физически можно, но ты не получишь нужную тебе информацию, так как она будет утеряна, искажена или еще что-то

как я приводил пример с целым типом, 4 байта, порезал как 3 и 1 кусок, это получилось 24 и 8 бит, в какой тип данных ты это все занесешь в свой массив чтобы сохранить? Вот подумай какой тип данных у тебя быть должен!!! 24 бита или 3 байта, можно разместить в массив байтов из 3 элементов

можно сделать массив и целочисленный, 4 байта скажем, в старшие биты записать сперва первые 3 байта, затем как второй элемент трактовать, записать в младший байт оставшиеся 8 бит, НО УДАЧИ ТЕБЕ потом все это дело собирать в нужное данное, зачем так извращаться? Это я только говорю о 4 байтах... Мой совет личный, не изобретай велосипед

Добавлено через 37 секунд
Цитата Сообщение от klaxwork Посмотреть сообщение
И еще один небольшой вопросик: чем отличается FS.Free от FS.Destroy?
выделяем и тыкаем F1... и пытаемся прочитать и разобраться что там написано
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.06.2014, 20:07
Помогаю со студенческими работами здесь

Как передать в stringstream переменную типа int?
Как запихнуть в stringstram int? Не находит такой перегруженной функции. sstream заинклудил. ifstream...

Как правильно передать переменную типа UnicodeString?
Привет друзья. Название темы вроде бы простое, но я сдался. В общем есть проект, в Builder 2009\2010 всё работает без проблем, а в XE2...

Переменную типа ushort разделить на 2 Byte
Здравствуйте, Господа. Раньше программировал на Делфи, перехожу на шарп. нужен код, который бы разделил число на два байта. Есть...

Ребят, как передать в другую activity переменную типа int?
// Первая активити switch (v.getId()) { case R.id.button1: int im = 0; // вот эту переменную надо передать Intent intent = new...

Вывести 2-битовые значения, упакованные в переменную типа Byte
В переменную типа Byte “упаковано” 4 маленьких неотрицательных целых значений, каждое из которых занимает по 2 соседних бита. Вывести все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru