Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Bascom - CRC dla tablicy 1024

elektronek
-
-
Posty: 8
Rejestracja: 30 gru 2010, o 22:26
Lokalizacja: Kraków

Bascom - CRC dla tablicy 1024

Postautor: elektronek » 30 sty 2011, o 11:43

Witam
Mam dwa pytania.
Ja utworzyć CRC dla tablicy zawierającej 1024 bajty.
Powinno się ją podzielić na mniejsze bliki i obliczać CRC32 czy istnieje jakiś inny sposób.
Oraz jaką maksymalną wielkość może osiągnąć tablica aby można było liczyć bezpiecznie CRC32.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2653
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 30 sty 2011, o 14:59

Tak samo, jak dla mniejszych tablic, niczego nie musisz dzielić. Nie wiem co w Twoim rozumieniu znaczy "bezpieczne liczenie CRC". Może poczytaj jeszcze jak się to CRC w ogóle oblicza.

elektronek
-
-
Posty: 8
Rejestracja: 30 gru 2010, o 22:26
Lokalizacja: Kraków

Bascom - CRC dla tablicy 1024

Postautor: elektronek » 30 sty 2011, o 17:12

Dobra inaczej
Oto krótki kod:

Kod: Zaznacz cały

$regfile = "m32def.dat" $crystal = 16000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Cursor Off Dim Ar(1024) As Byte Dim X As Long Dim A As Word For A = 1 To 1023 Ar(a) = 240 Next A Ar(1024) = 125 Do X = Crc32(ar(1) , 1024) Cls Lcd X Waitms 100 Loop End
Suma kontrolna wg tego kodu wynosi „-927242255” , gdy ostatni bajt zostanie zmieniony , obliczona suma pozostaje bez zmian.
Jeśli tablica będzie zawierać 256 bajtów

Kod: Zaznacz cały

$regfile = "m32def.dat" $crystal = 16000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Cursor Off Dim Ar(256) As Byte Dim X As Long Dim A As Word For A = 1 To 255 Ar(a) = 240 Next A Ar(256) = 125 Do X = Crc32(ar(1) , 256) Cls Lcd X Waitms 100 Loop End
suma z tego kodu wynosi „1430548066” jeśli ostatni bajt przyjmie wartość „101” suma kontrolna ulegnie zmianie i będzie wynosić „64750193” (przy crc16 wyniki są podobne). Bezpiecznie wg mnie oznacza „bycie pewnym obliczeń” a nie jestem. Chyba że źle do tego podchodzę.
Jeśli jest tu błąd to proszę naprowadź co jest nie tak lub w jaki sposób poprawnie obliczyć sumę z 1024 bajtów.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2653
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 30 sty 2011, o 18:59

Hmm... to może warto wczytać się w dokumentację Bascoma, szczerze pierwotnie nie zwróciłem na to uwagi. Być może implementacja Bascomowska ma pewne ograniczenia. Wówczas należało by albo stworzyć własną implementację, albo... dzielić wiadomość na bloki zabezpieczane własnymi CRC.
Nie jest to jednak jakieś ograniczenie CRC jako takiego.
Btw. CRC powinno być raczej wartością unsigned, choć jeśli po obu stronach przypiszemy je do takiego samego typu to nie powinno to wpłynąć na porównanie. ;)

elektronek
-
-
Posty: 8
Rejestracja: 30 gru 2010, o 22:26
Lokalizacja: Kraków

Bascom - CRC dla tablicy 1024

Postautor: elektronek » 30 sty 2011, o 19:14

W helpie tylko jeden przykład na tabeli 8 bajtowej, w opisanym przykładzie nie podają żadnych ograniczeń. Wiadomo że w bascomie można robić wstawki asm i może w ten sposób to wykonać. Natomiast z asm praktycznie nie miałem styczności i nie wiem jak się do tego zabrać. Podzielę tabelę na cztery bloki i powinno działać.
Dzięki za odpowiedź.

MES Mariusz
-
-
Posty: 91
Rejestracja: 17 lut 2005, o 12:02
Lokalizacja: Wrocław
Kontaktowanie:

Re: Bascom - CRC dla tablicy 1024

Postautor: MES Mariusz » 9 lut 2016, o 15:56

Cześć.

Wiecie może, dlaczego w Bascom AVR funkcja crc32 dla stringu 123 zwraca 494976085

Obrazek


Podczas, gdy w rzeczywistości ta wartość wynosi tyle:

Obrazek

https://www.tools4noobs.com/online_php_functions/crc32/

Ktoś wie jak działa / co stoi tak na prawdę za funkcją crc32 w Bascom AVR ?

Pozdrawiam
Mariusz

matrix
-
-
Posty: 342
Rejestracja: 7 maja 2010, o 14:02
Lokalizacja: Sochaczew
Kontaktowanie:

Re: Bascom - CRC dla tablicy 1024

Postautor: matrix » 10 lut 2016, o 09:46

Nie wiem czemu ale -> TUTAJ <- wyszło tak samo.
Do tego nie wiem dlaczego tu zakładasz temat skoro na forum atnel już Ci to wyjaśnili -> KLIK <-

MES Mariusz
-
-
Posty: 91
Rejestracja: 17 lut 2005, o 12:02
Lokalizacja: Wrocław
Kontaktowanie:

Re: Bascom - CRC dla tablicy 1024

Postautor: MES Mariusz » 10 lut 2016, o 10:34

Nie zakładam, co najwyżej podpinam pod istniejący (gdyż widzę, że koledzy oblatani w temacie).
Temat nie jest wyjaśniony. Ktoś zasugerował / zauważył, że mógł zostać użyty inny wielomian / inna odmiana CRC32.
Problem w tym, że nie wiadomo co to za wielomian, co to za odmiana. Mi póki co nie udało się tego do niczego dopasować.

piotr41
-
-
Posty: 2
Rejestracja: 23 maja 2016, o 16:43

Re: Bascom - CRC dla tablicy 1024

Postautor: piotr41 » 23 maja 2016, o 17:34

Gdzie masz CRC32 w przykładzie z Bascoma liczone od zmiennej typu String? i gdzie Ty widzisz 123?

Przykład liczy crc32 nie ze string tylko z 3 wartości liczbowych z tablicy AR(), czyli nie z ciągu znaków "123" tylko z trzech liczb 1,2,3

Tu liczysz CRC32 z 3 liczb typu Byte czyli max wartośc to 255 i CRC32 wyliczone prawidłowo:

Kod: Zaznacz cały

Dim Ar(3) As Byte Dim L As Long Ar(1) = 1 Ar(2) = 2 Ar(3) = 3 L = Crc32(ar(1) , 3) '494976085
Teraz przykład liczenia CRC32 z jednej liczby 123

Kod: Zaznacz cały

Dim L As Long Dim I As Byte I = 123 ' w HEX bedzie 7B L = Crc32(i , 1) Print L '961008917 Print Hex(l) ' 3947D515 ( i rewers 15D54739 - Taki wynik otrzymasz w kalkulatorach online)
np tu: http://www.lammertbies.nl/comm/info/crc ... ation.html

To samo, ale liczone z tablicy AR():

Kod: Zaznacz cały

Dim Ar(1) As Byte Dim L As Long Ar(1) = 123 L = Crc32(ar(1) , 1) Print L Print Hex(l)
Natomiast jeśli chcesz liczyć ze zmiennej typu string ,zapis bedzie taki:

Kod: Zaznacz cały

Dim Ar(1) As String * 3 Dim L As Long Ar(1) = "123" L = Crc32(ar(1) , 3) Print L Print Hex(l), Wynik D2634888 i jego rewers 884863D2
Chyba proste? i jak się okazuje CRC32 w Bascomie jest liczone wzorowo, a to wszytko jest opisane w helpie Bascoma.

Teraz to samo, ale bez korzystania z tablicy

Kod: Zaznacz cały

Dim I As String * 3 Dim L As Long I = "123" L = Crc32(i , 3) Print L Print Hex(l)
I całkiem na koniec, nieco więcej pisania,ale z wbudowanym rewersem

Kod: Zaznacz cały

Dim I As String * 3 Dim V As String * 8 Dim V2 As String * 2 Dim Decc As Dword Dim L As Long I = "123" L = Crc32(i , 3) V = Hex(l) Gosub Rewers Print "CRC32:" ; V ; " - Rewers Crc32 : " ; V2 Decc = Hexval(v2) Print "Dziesiętnie - " ; Decc End Rewers: V2 = Mid(v , 7 , 2) V2 = V2 + Mid(v , 5 , 2) V2 = V2 + Mid(v , 3 , 2) V2 = V2 + Mid(v , 1 , 2) Return

piotr41
-
-
Posty: 2
Rejestracja: 23 maja 2016, o 16:43

Re: Bascom - CRC dla tablicy 1024

Postautor: piotr41 » 23 maja 2016, o 19:58

Dobra inaczej

Oto krótki kod:

Kod: Zaznacz cały

$regfile = "m32def.dat" $crystal = 16000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Cursor Off Dim Ar(256) As Byte
Dim X As Long ' Tu powinno być Dim X As Dword to wszystko w temacie, reszta jest ok :) przykro, że trwało to 5lat;)

Kod: Zaznacz cały

Dim A As Word For A = 1 To 255 Ar(a) = 240 Next A Ar(256) = 125 Do X = Crc32(ar(1) , 256) Cls Lcd X Waitms 100 Loop End
.

Zapisał bym to tak:

Kod: Zaznacz cały

Dim Ar(1024) As Byte Dim X As Dword Dim A As Integer For A = 1 To 1023 Ar(a) = 240 Next A Ar(1024) = 255 X = Crc32(ar(1) , 1024) End

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości