Вверх ↑
Этот топик читают: Гость
Ответов: 85
Рейтинг: 0
#1: 2019-02-11 14:40:08 ЛС | профиль | цитата
Доброго вечера! На днях "поигрался" с ТСР- сервером и ТСР-клиентом, набросал в haism-е серверную часть и клиентскую часть. С товарищем перебросились парой фраз . Когда учился в институте изучал теорию кодов. Вот решил попробовать сделать сабжевую штуку. Однако подходящих блоков не оказалось в среде. Если кто занимался данной проблемой, подскажите как лучше реализовать ее. желательно без крутых наворотов, хочу понять принцип.....
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4621
Рейтинг: 746
#2: 2019-02-11 14:42:56 ЛС | профиль | цитата
RT9U писал(а):
подскажите как лучше реализовать ее
Как только подробнее объяснишь что это за
RT9U писал(а):
Кодер-декодер с последующим переспросом
и как он работает.
карма: 26

0
Ответов: 8886
Рейтинг: 823
#3: 2019-02-11 16:05:33 ЛС | профиль | цитата
Netspirit, шифровать -- расшифровывать сообщения по ключу присланному в предыдущем сообщении. По типу "https", если не перехватить первого сообщения с ранее обговорённым ключом, то врагу расшифровать не получится
карма: 19

0
Ответов: 85
Рейтинг: 0
#4: 2019-02-12 04:20:45 ЛС | профиль | цитата
Леонид, шифрование и кодирование - это разные вещи. шифрование - это преобразование информации с целью сокрытия ее ( информации) от других лиц, данное преобразование обратимое, т.е. дешифрируемое.
Кодирование - это преобразование информации в форму удобную для передачи по каналу связи, и обеспечение определенной помехоустойчивости.
Netspirit, вот пример и принцип работы самого простого кода

В передаваемую информацию вноситься избыточность , к примеру

восьмибитное слово 00000000 прибавляется еще один бит, значение которого есть логическая сумма первых восьми битов, например

000000000
000000011
000000101
000000110

Как это работает:
1. кодер передает информационное слово, которое имеет кодовую избыточность.
2. декодер принимает его и производит логическое сложение первых восьми битов. Результат сравнивает с 9 битом. Если он совпадает. то информация принята правильно. Производится декодирование согласно кодовой таблицы. Если результат не верен. Декодер выдает сигнал кодеру на повторную передачу данного слова.
Это самый простой код. Кодов великое множество. в том числе и самовосстанавливающие, т.е. если информация была повреждена декодер сам восстанавливает ее, использую избыточность кода.. Но данные коды сложны и я думаю пока не нужны. За основу можно взять к примеру ASCII, и что-нибудь придумать на ее основе.
Кстати в среде не нашел конвертера из ASCII в символы, есть только символы в ASCII
карма: 0

0
Ответов: 2059
Рейтинг: 131
#5: 2019-02-12 11:33:11 ЛС | профиль | цитата
Ну, прям код Хэмминга.
карма: 6

0
Ответов: 4621
Рейтинг: 746
#6: 2019-02-12 11:54:27 ЛС | профиль | цитата
Есть компонент RSRepair - можешь посмотреть. Но в целом, реализация собственных протоколов на TCP клиенте/сервере в HiAsm достаточно сложная.
А, собственно, зачем тебе это? Протокол TCP защищен от повреждения данных. А если требуется восстановление данных поступающих из другого источника, то их восстановление надо производить до передачи по TCP.
карма: 26

0
Ответов: 8886
Рейтинг: 823
#7: 2019-02-12 12:31:33 ЛС | профиль | цитата
RT9U, а-а, вот оно что Ну тогда, полагаю, надо не отдельные байты проверять, но какие-то более крупные блоки, строку, например, или по 255 байт + 256-ой контрольный. Есть IC для подсчёта CRC-8 строк от Galkov-а, прилагаю, вдруг пригодится (делал обмен данными с температурными датчиками).
CRC-8


Add(InlineCode,7214762,420,273)
{
@Hint=#16:Вычисление CRC-8|
WorkPoints=#5:doCRC|
EventPoints=#5:onCRC|
DataPoints=#7:DataStr|3:Pol|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Windows,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|4: |9: public|25: _data_Data:THI_Event;|18: Pol:THI_Event;|22: DataStr:THI_Event;|20: onCRC:THI_Event;|0:|49: procedure doCRC(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|28:procedure THiAsmClass.doCRC;|23:var _Str:string; // Код|29: i,j,_Pol,CRC,_Len: dword;|5:begin|36: _Str := ReadString(_Data,DataStr);|23: _Len := Length(_Str);|62://-------Author Galkov-------------------------------------- |39: _Pol := ReadInteger(_Data,Pol) shl 8;|12: CRC := 0;|31: for i := 1 to _Len+1 do begin|31: CRC := CRC + byte(_Str[i]);|28: for j := 1 to 8 do begin|23: CRC := CRC shl 1;|55: if (CRC and $10000) > 0 then CRC := CRC xor _Pol;|8: end;|6: end;|32: _hi_onEvent(onCRC, CRC shr 8);|4:end;|0:|4:end.|
link(Pol,9182407:Value,[])
}
Add(Memory,9182407,427,224)
{
Default=Integer(305)
}

карма: 19

0
Ответов: 85
Рейтинг: 0
#8: 2019-02-12 13:32:52 ЛС | профиль | цитата
flint2 писал(а):
Ну, прям код Хэмминга

откуда знаешь?
Netspirit, С ТСР мне и так понятно, но есть другие каналы связи... Я связан с радио например. Ник это мой радиолюбительский позывной - RT9U. Естественно в радиоканале никакой защиты нет.
Netspirit писал(а):
А, собственно, зачем тебе это?

А фиг его знает, наверное для тренировки мозга
Леонид, спасибо, правда пока не понял как его применять??? надо почитать про CRC-8
карма: 0

0
Ответов: 2059
Рейтинг: 131
#9: 2019-02-12 13:53:03 ЛС | профиль | цитата
RT9U писал(а):
откуда знаешь?

Я подобное делал на регистрах сдвига 155 серии ещё в 1978 году.
Корректней говорить: - "Ещё помнишь?".
Знать-то мы знаем много чего, а вот всё-ли помним?
Вещи из разряда азбуки, как правило, не забываются.

Редактировалось 1 раз(а), последний 2019-02-12 13:58:31
карма: 6

0
Ответов: 8886
Рейтинг: 823
#10: 2019-02-12 14:31:30 ЛС | профиль | цитата
RT9U, на вход (или верхнюю точку) подаёте строку, на выходе байт подсчитанный по кодовому полиному с верхней точки, пристёгиваете его в конец строки и на выход. На приёмной стороне этот байт от строки отделить, таким же манером посчитать CRC и сравнить с полученным. Равны -- искажений нет.

--- Добавлено в 2019-02-12 14:36:35

flint2 писал(а):
Вещи из разряда азбуки, как правило, не забываются.
Тоже так полагал, но оба мы ошибаемся -- ранее на вопрос "Сколько 27*37?" не задумываясь отвечал 999, а сейчас умножать в уме приходится и не факт, что не ошибёшься

Редактировалось 2 раз(а), последний 2019-02-12 16:24:26
карма: 19

0
Ответов: 2059
Рейтинг: 131
#11: 2019-02-12 15:03:13 ЛС | профиль | цитата
Как не странно, ротор и дивергенцию векторного поля помню.
Вернее легко вспомнил - в сценах 3D игрушек иногда применяю для освещения и частиц. (Седина в бороду...)
"Сколько 27*37?"

Мозги тут-же перегрелись!
И в магазине, считаешь-считаешь, считаешь-считаешь... и всё не сходится!

Редактировалось 2 раз(а), последний 2019-02-12 15:15:04
карма: 6

0
Ответов: 8886
Рейтинг: 823
#12: 2019-02-12 15:33:54 ЛС | профиль | цитата
flint2, рассказывал здесь пост 264 http://forum.hiasm.com/topic/54492/17

Редактировалось 1 раз(а), последний 2019-02-12 15:35:00
карма: 19

0
Ответов: 2059
Рейтинг: 131
#13: 2019-02-12 15:45:08 ЛС | профиль | цитата
Вдогонку о игрушках, к теме не относится.

Вот такие Roguelike тоже нравится делать.
Столкновения, поведение "монстров", нахождение пути, процедурная генерация уровней -
RT9U писал(а):
А фиг его знает, наверное для тренировки мозга

В Hiasm надо переложить, вроде все компоненты есть, даже Lua.


Редактировалось 2 раз(а), последний 2019-02-12 15:47:16
карма: 6

0
Ответов: 85
Рейтинг: 0
#14: 2019-02-13 17:53:29 ЛС | профиль | цитата
да ладно вам про игрушки тут тема серьезная про кодирование....
в тырнете нашел про код хоффмана https://www.youtube.com/watch?v=snaKyL4mMDg
кстати код прикольный.. в канале связи информацию можно передавать быстрее чем без кодирования..
основан на частоте появления букв. в видео конечно пример. т.к. вероятности появления букв примерные.. и алфавит для 4 букв..
но принцип понятен.
вот что получилось в Хайасм-е как нистранно работает....


Add(MainForm,2953706,21,105)
{
Width=225
Height=287
}
Add(Edit,1965920,21,189)
{
Left=20
Top=10
Width=145
Text=""
link(onEnter,16652159:doCase,[])
}
Add(Case,16652159,77,196)
{
Value=String(a)
DataOnTrue=String(1)
link(onNextCase,10905893:doCase,[(128,202)(128,230)])
link(onTrue,13477404:doEvent1,[(229,209)(229,139)])
}
Add(Case,10905893,147,224)
{
Value=String(d)
DataOnTrue=String(00)
link(onNextCase,2443070:doCase,[(212,230)(212,251)])
link(onTrue,13477404:doEvent2,[(265,237)(265,146)])
}
Add(Case,2443070,217,245)
{
Value=String(b)
DataOnTrue=String(011)
link(onNextCase,1354831:doCase,[(271,251)(271,272)])
link(onTrue,13477404:doEvent3,[(299,258)(299,153)])
}
Add(Case,1354831,294,266)
{
Value=String(c)
DataOnTrue=String(010)
link(onTrue,13477404:doEvent4,[(338,279)(338,160)])
}
Add(Memo,3096200,392,210)
{
Left=20
Top=40
Width=140
AddType=1
ScrollBars=2
}
Add(Hub,13477404,357,133)
{
InCount=4
link(onEvent1,7420481:doCase,[])
link(onEvent2,3096200:doAdd,[(381,146)(381,216)])
}
Add(Case,7420481,455,133)
{
Value=String(1)
DataOnTrue=String(a)
link(onNextCase,14153295:doCase,[])
link(onTrue,9134566:doEvent1,[(502,146)(503,240)(503,272)])
}
Add(Case,14153295,525,133)
{
Value=String(00)
DataOnTrue=String(d)
link(onNextCase,8988473:doCase,[])
link(onTrue,9134566:doEvent2,[(569,146)(569,279)])
}
Add(Case,8988473,595,133)
{
Value=String(011)
DataOnTrue=String(b)
link(onNextCase,15811328:doCase,[])
link(onTrue,9134566:doEvent3,[(640,146)(640,286)])
}
Add(Case,15811328,651,133)
{
Value=String(010)
DataOnTrue=String(c)
link(onTrue,9134566:doEvent4,[(701,146)(701,293)])
}
Add(Hub,9134566,798,266)
{
InCount=4
OutCount=1
link(onEvent1,14151802:doAdd,[(840,272)(840,279)])
}
Add(Memo,14151802,868,273)
{
Left=20
Top=130
Width=140
AddType=1
ScrollBars=2
}

карма: 0

0
Ответов: 2059
Рейтинг: 131
#15: 2019-02-13 21:24:40 ЛС | профиль | цитата
В большей степени эти коды преследовали цель сбалансировать передаваемый код по энергиям.
То есть разбить большие массивы нулей, или единиц их чередованием - самомодуляцией.
Исправление ошибок - это дело второе. И исходит из условия избыточности. Хотя тоже важно.
да ладно вам про игрушки, тут тема серьезная про кодирование....

Серьёзней темы игрушек,на сегодняшний день,пока трудно найти.
Эта тема затрагивает практически все направления программирования.
Лингвистика (процедурная генерация диалогов, сюжетных линей, квестов, распознавание речи - когда рот в такт слогам двигается, морфология, синтаксис...).
(Сейчас, как раз, занимаюсь генератором сюжетных линий(уже готов) и раскрытием сюжета - генерацией связанных предложений. Естественно с падежами и склонениями.)
ИИ, сам по себе содержит огромное подмножество направлений - от нейронных сетей и прологоподобных машин, ... до конечных автоматов и Марковских таблиц вероятных состояний.
Физика твёрдых и мягких тел, преломление в средах, тяготение и пересечение векторов, трение, видимость...
Сетевые решения - далеко нетривиальные.
Открытые и закрытые миры и их процедурная генерация. Отсечения, глубина обработки, бесконечные карты...
3D и 2D графика, тут каждая имеет сотни направлений.
Даже звук в игрушках нетривиальный проигрыватель, порою OpenAL не годится.
Ну и плюс задачи размещения всякого рода контента и динамической смены его в памяти.
И вся эта бадяга должна крутиться не менее FPS=60.
В общем, сразу всё не перечислишь. И всё это - сплошная математика.

Редактировалось 6 раз(а), последний 2019-02-13 22:05:01
карма: 6

0
15
Сообщение
...
Прикрепленные файлы
(файлы не залиты)