Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299

Обработка пакетов

23.01.2019, 02:50. Показов 5871. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Как реализовать следующую задачу:
Есть файл с переданными пакетами. Длина пакетов 1936 байт.
Но может быть и меньше в случае передачи пакета с ошибкой.
- Первые 2 байта каждого пакета синхронизация (в десятичном представлении: 8 2).
- 1935 и 1936 байт имеют вид 0 1 или 1 0.
- 1930 байт счётчик пакетов (от 0 и до...).
Нужно:
1) Выбрать пакеты длиной 1936 байт начало которых 8 2 и окончание 0 1 либо 1 0.
2) Удалить повторяющиеся пакеты.
3) Отсортировать по счётчику (1930 байт).
4) Удалить Байты синхронизации (8 2) и 7 байт в конце каждого пакета.
5) Сохранить в файл.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.01.2019, 02:50
Ответы с готовыми решениями:

Отправка пакетов
Доброго времени суток. Давно интересовался данной функцией , о найти толкового ответа , как ей пользоваться не нашел. Подскажите если...

Перехват пакетов
Подскажите пожалуйста, как в делфи можно работать с пакетами в браузере?Сколько не искал - ничего не нашел.

Разбор AVL пакетов GPS
Здравствуйте Ув. программисты. - Имеется трекер Teltonika FM4200. - Имеется TCP сервер слушающий определённый порт. Ранее TCP...

48
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299
25.01.2019, 04:16  [ТС]
Студворк — интернет-сервис помощи студентам
northener, объясните тупому. Буду знать.
Программирование это не моя профессия, поэтому и прошу помочь.

Добавлено через 1 час 21 минуту
Нашёл, что в Делфи 7 нет Generics.Collections.
В этом причина?
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
25.01.2019, 04:24
Цитата Сообщение от Alex99999 Посмотреть сообщение
В этом причина?
В этом. Либо Делфи свежее качать, либо окунуться во все прелести динамических массивов.
0
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299
25.01.2019, 04:29  [ТС]
Nanotentacle, спасибо огромное. Но легче не стало...
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
25.01.2019, 10:33
ну собсно ничего не поменяется принципиально-то.
Но нелицензионную Д7 я бы поменял на лицензионную бесплатную Delphi 10.3 CE
вот вариант, который будет работать и в D7

Сильно помогло вам?

Кликните здесь для просмотра всего текста
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
unit UMainForm;
 
 
interface
 
uses
  Classes, Forms, types, ExtCtrls, StdCtrls, Controls, Contnrs, SysUtils;
 
type
  TPacketRec = packed record
    header: word; // 0-1
    data: array[0..1927] of byte; // 2-1939
    counter: byte; // 1930
    reserved: array[0..3] of byte; // 1931-1934
    endMarker: word; // 1935-1936
  end;
 
  TPacketClass = class
  public
    packet: TPacketRec;
    function IsCorrect: boolean;
  end;
 
  TPacketList = class(TObjectList)
  private
    function GetItemas(index: integer): TPacketClass;
    procedure SetItems(index: integer; const Value: TPacketClass);
  public
    property Items[index: integer]: TPacketClass read GetItemas write SetItems;
  end;
 
  TfMainForm = class(TForm)
    b1: TButton;
    pnl1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure b1Click(Sender: TObject);
  private
    procedure ReadFile(filename:string);
  public
    list: TPacketList;
  end;
 
var
  fMainForm: TfMainForm;
 
implementation
 
{$R *.dfm}
 
function findPacketBegin(f: TFileStream; StartPos: integer): integer;
const
  BUF_SIZE = 4096;
var
  buf: array[0..BUF_SIZE - 1] of byte;
  i, n: integer;
begin
  result := -1;
  f.position := StartPos;
  repeat
    n := f.read(buf[0], BUF_SIZE);
    for i := 0 to n - 2 do
    begin
      if (buf[i] = $08) and (buf[i + 1] = $02) then
      begin
        result := i;
        f.position := result;
        exit;
      end
    end;
    f.Position := f.Position - 1; // если вдруг $08 - это последний байт буфера
  until n < BUF_SIZE;
 
  f.position := StartPos;
end;
 
function TPacketClass.IsCorrect: boolean;
begin
  result := (packet.header = $0208) and ((packet.endMarker = $0100) or (packet.endMarker = $0001));
end;
 
{ TPacketList }
 
function TPacketList.GetItemas(index: integer): TPacketClass;
begin
  result := inherited Items[index] as TPacketClass;
end;
 
procedure TPacketList.SetItems(index: integer; const Value: TPacketClass);
begin
  inherited Items[index] := Value;
end;
 
procedure TfMainForm.ReadFile(Filename:String);
var
  f: TFileStream;
  p: TPacketClass;
  ind, StartPos: integer;
begin
  StartPos := 0;
  f := TFileStream.Create(Filename, fmOpenRead);
  while f.size - f.position > SizeOf(TPacketRec) do
  begin
    ind := FindPacketBegin(f, StartPos);
    if ind <> -1 then
    begin
      p := TPacketClass.Create();
      f.read(p.packet, sizeof(p.packet));
      if p.IsCorrect then
      begin
        list.add(p)
      end
      else
      begin
        p.free;
        StartPos := StartPos + 2;
      end
    end;
  end;
 
  f.free;
end;
 
procedure TfMainForm.b1Click(Sender: TObject);
begin
  ReadFile('вашфайл') ;
  // сейчас в List содержится список найденных пакетов
end;
 
procedure TfMainForm.FormCreate(Sender: TObject);
begin
  list := TPacketList.Create();
end;
 
procedure TfMainForm.FormDestroy(Sender: TObject);
begin
  FreeAndNil(List);
end;
 
 
 
end.


Добавлено через 25 секунд
P.S. не проверял вообще
0
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299
25.01.2019, 14:00  [ТС]
krapotkin, Спасибо огромное за проделанную работу. Буду потихоньку разбираться.
Конечно очень много не понятно. Как правильно обращаться к элементам списка? (для вывода их например в StringGrid)
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
25.01.2019, 14:13
элемент списка - list[i]
структура внутри элемента - list[i].packet
ну и далее например list[i].packet.counter
0
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299
25.01.2019, 16:09  [ТС]
krapotkin, конечно я уже достал Вас, но не могли бы привести пример вывода хотя бы одного элемента в Memo?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
25.01.2019, 16:58
в каком виде ??
0
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299
25.01.2019, 17:06  [ТС]
В том в котором они хранятся в List если можно.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
25.01.2019, 18:39
Лучший ответ Сообщение было отмечено Alex99999 как решение

Решение

в листе хранятся ссылки на объекты, каждый из которых загружен из файла
т.е. N раз по 1936 байтов
как вы хотите их смотреть??
просто 1936 шестнадцатиричных чисел вывести на экран ?
1
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
25.01.2019, 19:27
Лучший ответ Сообщение было отмечено Alex99999 как решение

Решение

Надеюсь так вообще понятно и ничего не нужно делать
Вложения
Тип файла: 7z packets.7z (1.97 Мб, 2 просмотров)
1
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299
25.01.2019, 21:06  [ТС]
krapotkin, спасибо огромнейшее. Сам бы я никогда не решил подобную задачу. А почему в Memo 12 раз
выводится 1-ый пакет, а где остальные?
0
26.01.2019, 02:22

Не по теме:

Цитата Сообщение от Alex99999 Посмотреть сообщение
Программирование это не моя профессия, поэтому и прошу помочь.
Поймите меня правильно. Помочь все участники сего форума всегда готовы. Но если помощь должна выражаться в написании за вас программы полностью, отладку этой программы, да ещё и разжёвывание для вас ещё и её деталей, то это несколько больше чем просто помощь.
Я вот например не прошу на форуме сантехников помочь мне заменить смеситель в ванной надеясь что кто-то из участников того форума приедет ко мне домой и заменит его бесплатно. :)

0
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299
26.01.2019, 04:16  [ТС]
northener, да я конечно понимаю, что это перебор. Но для меня данная тема - это тёмный лес (да как впрочем и всё программирование), а времени не особо. А программа реализующая вышеперечисленный алгоритм очень нужна.

Добавлено через 1 час 26 минут
Сам я делал так:
1 При загрузке файла переводил значение байт в двоичный вид (в S:String)
2 Находил позицию 0000100000000010 (8 2 в десятичной)
3 Копировал в StringList 15478 бит начиная с позиции 0000100000000010-(синхронизация)
4 Находил позицию 000000000000001 (0 1 в десятичной) либо 000000100000000 (1 0 в десятичной)-(2 байта в конце)
5 Делал проверку если очередная строка StringList с позиции 15472 = 000000000000001 либо 000000100000000,
то оставлял строку если нет, то удалял.
6 В другой StringList копировал информацию начиная с 17 бита вместе со счётчиком (длина строки 15424 бита)
7 Удалял повторяющиеся строки
На этом у меня всё остановилось (уже сам начал путаться в том что нагородил), поэтому и обратился на данный форум.

Далее по идее нужно:
1 отсортировать все строки по последним 8 битам (номер пакета в общем блоке)
2 Ну и собственно удалить эти 8 бит и сохранить в файл
Может загрузить полученные строки в десятичном виде в StringGrid и отсортировать по последнему 1928 байту?
Опять же: моих знаний явно не хватит для этого.
Как можно упростить данную ересь, наверняка,то что я написал делается гораздо короче. С массивами в отпуске буду разбираться.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
26.01.2019, 09:09
Лучший ответ Сообщение было отмечено Alex99999 как решение

Решение

Цитата Сообщение от Alex99999 Посмотреть сообщение
выводится 1-ый пакет, а где остальные?
потому что не тестировал,
вот исправленный вариант

но дальше вам придется либо нанять программиста
либо разобраться самому
отвечать на вопросы тут все готовы
но у вас нет конкретных вопросов, а только ТЗ...
Вложения
Тип файла: 7z packets.7z (1.97 Мб, 3 просмотров)
1
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
26.01.2019, 09:12
Лучший ответ Сообщение было отмечено Alex99999 как решение

Решение

вариант с переводом в двоичный вид - совсем плох
байт это просто число. не требуется его никуда переводить
если сказано что байт=8, а следующий = 2, вот собсно и
Delphi
1
if (Arr[xxx]=8)and(Arr[xxx+1]=2) then
1
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299
26.01.2019, 09:51  [ТС]
krapotkin, я уже не знаю как Вас благодарить за проделанный труд.
В свободное время буду потихоньку разбираться во всём. Вопросы не задавал потому что даже и не знаю, что и как
спросить.
Цитата Сообщение от krapotkin Посмотреть сообщение
1
if (Arr[xxx]=8)and(Arr[xxx+1]=2) then
а для этого файл нужно загрузить в массив byte?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
28.01.2019, 22:13
мы предполагаем, что файл большой и нет смысла его полностью скачивать в массив
для работы с файлами есть концепция потока (Stream) НЕ ПУТАТЬ с потоками операционной системы (Thread)
файл по мере необходимости загружается по кускам в некоторый буфер, а из буфера этого стрима мы уже можем загрузить к себе в небольшой массив или запись сколько-то байтов

в данном случае предполагается что в массив байтов Arr загружен какой-то кусок файла
в моем примере я загружаю из стрима в буфер 1000 байтов и ищу там байты 8 2
если не нашел, загружаю в этот буфер следующий кусок

все это сделано из-за того, что вы сказали, что пакеты а файле могут быть битыми, неполными
поэтому поиск каждый раз веду по всем признакам
иначе можно было просто загрузить файл кусками по 1936 байт в записи нужного типа
0
 Аватар для Alex99999
1 / 1 / 1
Регистрация: 03.12.2012
Сообщений: 299
01.02.2019, 15:53  [ТС]
krapotkin, Не могли бы Вы объяснить принцип функции:
Delphi
1
2
3
4
 function TPacketClass.IsCorrect: boolean;
begin
  result := (packet.header = $0208) and ((packet.endMarker = $0100) or (packet.endMarker = $0001));
end;
В смысле не принцип работы (он понятен), а что значат:
$0208, $0100, $0001
ясно, что это 8 2 и 1 0 или 0 1, а как формируются и почему наоборот?
0
62 / 48 / 20
Регистрация: 01.09.2017
Сообщений: 381
01.02.2019, 16:11
О-го-го как эту тему раскочегарили, аж вторая страничка уже полная.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2019, 16:11

Перехват пакетов, отправляемых на устройство
День добрый. Решил освоить Делфи, и первая задача которую мне поставил: Есть ПО которое чрез виртуальные компорты(Есть устройство...

Отправка ICMP пакетов на указанный IP
напишите пожалуйста код программы что бы при ее запуске отправлялось определенное колличество пакетов на уже заранее указанный IP в коде:D

Очередность обработки пакетов из TClientSocket
Всем доброго времени суток! Имеется соединение с сервером через TClientSocket. При получении пакетов от сервера нужно обрабатывать каждый...

Чтение и запись пакетов Byte
Доброго дня. Есть сокет TCP, через него постоянно бегут пакеты PByte. Задача анализировать пакеты, вносить изменения, вести...

Icmp - узнать кол-во потерянных пакетов
Как узнать кол-во потерянных пакетов (в процентах). Заранее спасибо. (Исходник давать не обязательно).


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru