CRC-16 lub podobne

Witam wszystkich grupowiczow. Mam pewien problem. Komputer porozumiewa sie z maszyna za pomoca zlacza rs. Komenda sklada sie z paczki 12 bajtow, z czego 2 ostatnie sa dla mnie zupelnie nie zrozumiale. prawdopodobnie jest to CRC-16 lubo cos podobnego. Chcialbym sie dowiadziec jak to wyliczyc, poniewaz moje zadanie polega na zasymulowaniu oryginalnego programu. Jezeli zmieni sie jakikolwiek bit w sygnale - maszyna nie odpowiada. Ponizej podaje kilka przykladow takiego sygnalu.

00 01 10 00 00 00 00 00 00 00 A1 65 00 01 11 00 00 00 00 00 00 00 C4 55 00 01 12 00 00 00 00 00 00 00 6B 05 00 01 12 01 00 00 00 00 00 00 EB 65 00 01 12 02 00 00 00 00 00 00 0E C5 00 01 12 0A 00 00 00 00 00 00 FF B8 00 01 12 00 00 01 00 00 00 00 4B AE 00 01 12 00 00 01 00 00 00 00 4B AE 00 01 12 00 00 02 00 00 00 00 2B 78 00 01 12 00 00 0A 00 00 00 00 4E A7 00 01 12 0A 00 0A 00 00 00 00 DA 1A 00 01 12 B4 00 F0 00 00 00 00 53 18

Prosze o pomoc w jaki sposob mozna dojsc do tego jak wyliczyc ostatnie 2 bajty. W ww przykladach moge zmieniac 4, 5, 6 i 7 bajt sygnalu. Moge jeszcze podac inne przyklady, w ktorych wartosci sa juz z gory narzucone przez wymogi maszyny.

00 01 22 14 BF 04 00 00 00 00 D4 8D 00 01 67 14 BF 04 00 00 00 00 89 A2 01 00 00 22 00 00 00 00 00 00 FF 13 01 00 71 22 92 00 00 00 00 04 41 0F 00 01 21 29 5F 02 00 00 00 00 D6 5F 00 01 67 29 5F 02 00 00 00 00 24 20 01 00 00 21 00 00 00 00 00 00 1A B3 01 00 02 21 00 BE 04 00 00 00 65 C4 00 01 22 29 5F 02 00 00 00 00 79 0F 00 01 67 29 5F 02 00 00 00 00 24 20 01 00 00 22 00 00 00 00 00 00 FF 13 01 00 71 22 92 00 00 00 00 04 41 0F 00 01 21 29 77 00 00 00 00 00 DB 4D 00 01 67 29 77 00 00 00 00 00 29 32 01 00 00 21 00 00 00 00 00 00 1A B3 01 00 02 21 00 EE 00 00 00 00 68 8C

Z gory dziekuja za pomoc

pozdrawiam kwia-Tec

Reply to
kwia-Tec
Loading thread data ...

Prawdopodobnie nie jest to crc16 lecz jakia suma kontrolna obliczana innym sposobem, albo tez przy liczeniu sumy nie sa uwzgledniane wszystkie bajty ciagu. Jesli jest to zabezpieczenie (a rozumiem, ze jest) to bedzie ci ciezko zgadnac jakiego algorytmu uzyl tworca urzadzenia. Najlatwiej w takiej sytuacji uzyc metody bruteforce i dla wszystkich interesujacych cie ciagow obliczyc sumy (sprawdzic kombinacje z zakresu 0000-FFFF, ktoras musi pasowac) i zapisac je w tablicy. Jesli chcesz poczytac o crc16 to to sa linki (google twoim przyjacielem):

formatting link
tu sa programy do liczenia crc16 (miedzy innymi):
formatting link
/PM

Reply to
projekt

Jezeli ktos mam jakiekolwiek pomysly, jak to rozwiklac , bede wdzieczny za pomoc :)

Z gory dziekuje i pozdrawiam kwia-Tec

Reply to
kwia-Tec

Zaczales dobrze - trzeba analizowac dane rozniace sie jednym bitem.

Mnie to wyglada faktycznie na CRC. Przydaloby sie zaczac od samych zer i potem dodawac skrajne jedynki - na poczatek namierzyc od ktorej strony bajtu bity sa wprowadzane i jak wyprowadzane - bo na razie to mamy za duzo mozliwosci.

I zobacz jeszcze czy twoja funkcja jest xorowalna, tzn

f(03) = f(00) xor f(01) xor f(02)

I podobnie dla kombinacji bitow na innych pozycjach

Moze wystarczy ci tablica sum kontrolnych dla poszczegolnych bitow danych, potem tylko xorujesz odpowiednie. Bo namierzenie wielomianiu CRC i wartosci poczatkowej moze byc klopotliwe.

J.

Reply to
J.F.

Powitanko,

I tak powinno byc

Dorzuce jeszcze pare sznurkow:

formatting link
z tych 2 liczyl dobrze crc16. Jak kiedys rozpracowywalem temat, to tych crc jest od groma, nawet AFAIR crc16 sa 2 rodzaje i inaczej sie je liczy. Pozostaje podstawiac do kalkulatorow i sprawdzac.

Pozdroofka, Pawel Chorzempa

Reply to
Pawel "O'Pajak

A w dodatku nie "diametralnie" tylko o kilka bitow - i tak ma byc :-)

formatting link
Przy czym cala masa innych wielomianow tez moze byc uzyta.

J.

Reply to
J.F.

Chyba dam sobie spokoj... zapisze sobie wszystkie potrzebne komendy do tablicy i juz. W sumie to nie jest ich tak duzo... tylko 384 :)

Dzieki za checi i zainteresowanie.

pozdrawiam kwia-Tec

Reply to
kwia-Tec
Reply to
Arkadiusz Kaczmarek

Akurat crc na '51 bardzo prosto sie robi. Moze nawet prosciej niz na innych - choc dluzej.

J.

Reply to
J.F.

O tym wlasnie mowilem w pierwszym poscie /PM

Reply to
projekt

Powiedzmy, ze wysylasz do urzadzenia taki ciag:

00 01 10 00 00 00 00 00 00 00 [XX] [XX] ale nie wiesz jaka wartosc powinny miec ostatnie 2 bajty, czyli [XX][XX] W takim razie podstawiasz za [XX][XX] wszyskie kombinacje od [00][00] do [FF][FF] (szesnastkowo) Ciag zakonczony ktoras z tych kombinacji zostanie zaakceptowany i ta koncowke zapisujesz sobie w tablicy. Sumy w tablicy trzeba oczywiscie jakos zaindeksowac. Aby tablica byla jak najmniejsza, mozesz robic zwykle crc8 lub crc16 dla kazdego ciagu ktory sprawdzasz, w tym wypadku dla ciagu 00 01 10 00 00 00 00 00 00 00 obliczasz crc16 (np) i to bedzie indeks. Do tego indeksu bedzie przypisana wlasciwa koncowka [XX][XX] ktora wczesniej "znalazles". Tablice wystarczy posortowac wedlug indeksow (np od najmniejszego do najwiekszego). Teraz jesli wysylasz do swojego urzadzenia jakis ciag i nie znasz koncowki, to robisz po kolei: 1.obliczasz dla niego zwykle crc16 2.dla tego obliczonego crc16 szukasz w tablicy odpowiedniej koncowki. 3.uzupelniony ciag mozesz wyslac do urzadzenia. Pozdrawiam. /PM
Reply to
projekt

"kwia-Tec" napisal:

Np. dlatego że nie potrafi zaimplementować CRC albo chce utrudnić życie komuś takiemu jak ty :)

Zawsze możliwe że autor oryginału walnął się w implementacji - np. mnie się coś takiego przytrafiło - liczyłem crc32 z niewłaściwym endianem, wszystko było w porządku dopóki maszynki gadały tylko z "rodziną", aż któregoś dnia dołączono do systemu urządzenie innej firmy... ale był obciach. GRG

Reply to
Gregor
Reply to
Arkadiusz Kaczmarek

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.