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

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

23.01.2019, 02:50. Показов 5645. Ответов 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,684
Записей в блоге: 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,684
Записей в блоге: 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,684
Записей в блоге: 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,684
Записей в блоге: 21
25.01.2019, 18:39
Лучший ответ Сообщение было отмечено Alex99999 как решение

Решение

в листе хранятся ссылки на объекты, каждый из которых загружен из файла
т.е. N раз по 1936 байтов
как вы хотите их смотреть??
просто 1936 шестнадцатиричных чисел вывести на экран ?
1
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 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,684
Записей в блоге: 21
26.01.2019, 09:09
Лучший ответ Сообщение было отмечено Alex99999 как решение

Решение

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

но дальше вам придется либо нанять программиста
либо разобраться самому
отвечать на вопросы тут все готовы
но у вас нет конкретных вопросов, а только ТЗ...
Вложения
Тип файла: 7z packets.7z (1.97 Мб, 3 просмотров)
1
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 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,684
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru