![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 331 Pomógł: 30 Dołączył: 11.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Chcę napisać własną klasę generująca kody datamatrix, jednak do tego potrzebne jest kodowanie w korekcji błędów reed-solomon, Znalazłem algorytmy Reed-Solomon i napisałem na ich podstawie prostą klasę, która ma generować kody korekcji błędów, ale nie wiem co zrobiłem źle, bo nie działa tak jak powinna... Dla danych 142, 164, 186 pięć słów kontrolnych powinno być kolejno: 114, 25, 5, 88, 102... Bardzo proszę WAS o pomoc w tej sprawie kod klasy: Kod <? class datamatrix{ public $data_array; public function ReedSolomon($numbercw,$fact_array){ $reed_data=array(); $data_array=$this->data_array; $c=0; $t=0; for($i=0;$i<count($data_array);$i+=1){ $t= ($data_array[$i] xor $reed_data[$numbercw-1]); for($j=$numbercw-1;$j>=0;$j-=1){ if($t=0){ $reed_data[$j]=0; }else{ $reed_data[$j]=$this->Mult($t,$fact_array[$j]); } if($j>0) $reed_data[$j]=$reed_data[$j-1] xor $reed_data[$j]; } } return $reed_data; } private function Mult($a,$b){ $log[0]=-255; $alog[0]=1; for($i=1;$i<=255;$i+=1){ $alog[$i]=$alog[$i-1] * 2; if($alog[$i]>=256) $alog[$i] = $alog[$i] xor 301; $log[$alog[$i]]=$i; } $mult=$alog[($log[$a]+$log[$b]) % 255]; return $mult; } } $datamatrix=new datamatrix(); $datamatrix->data_array=array(142,164,186); print_r($datamatrix->ReedSolomon(5,array(228,48,15,111,62))); ?> Kody czerpię z tej strony: http://www.piotrek94.ovh.org/datamatrix/datamatrix.htm -> http://grandzebu.net/index.php Z góry dziękuję za pomoc - nagrodzę ją umieszczeniem pseudonimu i dodatkowych danych w autorach skryptu. -------------------- http://www.piotr94.net21.pl/ - wykonanie stron i serwisów internetowych
Jeśli moje wypowiedzi były dla Ciebie pomocne, kliknij "Pomógł" i odwdzięcz się ;) |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 2 885 Pomógł: 463 Dołączył: 3.10.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
zamiast xor daj ^
poza tym nie mam pewności czy poprawnie implementujesz to: Let k the number of correction CWs, a the factors array, m the number of data CWs, d the data CWs array and c the correction CWs array. We'll use a temporary variable t. c and t are inited with 0. And let's go with the math fiddle : For i = 0 To m - 1 t = (d(i) Xor c(k - 1)) For j = k - 1 To 0 Step -1 If t = 0 Then c(j) = 0 Else c(j) = Mult(t, a(j)) End If If j > 0 Then c(j) = c(j - 1) Xor c(j) Next Next Mult is the special Galois field multiplication. Ten post edytował darko 11.11.2009, 19:28:10 -------------------- Nie pomagam na pw, tylko forum.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 331 Pomógł: 30 Dołączył: 11.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Hmm, zamienię zaraz xor na ^, wydaje mi się że poprawnie zaimplementowałem to w php, wszystkie zmienne się zgadzają...
k - ilość bitów korekcyjnych a - tablica pomocnicza z prekalkulowanymi wartościami dla odpowiedniej ilości liczby k) m - ilość słów danych d - tablica z danymi c - wynikowa tablica ze słowami korekcyjnymi t - zmienna pomocnicza c i t inicjujemy wartościami 0 zmieniłem skrypt tak (dodałem nawiasy paru miejscach żeby był pewny priorytet, zmieniłem xor na ^): CODE <? class datamatrix{ public $data_array; public function ReedSolomon($numbercw,$fact_array){ $reed_data=array(); $data_array=$this->data_array; $c=0; $t=0; for($i=0;$i<count($data_array);$i+=1){ $t= ($data_array[$i] ^ $reed_data[$numbercw-1]); for($j=$numbercw-1;$j>=0;$j-=1){ if($t=0){ $reed_data[$j]=0; }else{ $reed_data[$j]=$this->Mult($t,$fact_array[$j]); } if($j>0) $reed_data[$j]=($reed_data[$j-1] ^ $reed_data[$j]); } } return $reed_data; } private function Mult($a,$b){ $log[0]=-255; $alog[0]=1; for($i=1;$i<=255;$i+=1){ $alog[$i]=$alog[$i-1] * 2; if($alog[$i]>=256) $alog[$i] = ($alog[$i] ^ 301); $log[$alog[$i]]=$i; } $mult=$alog[(($log[$a]+$log[$b]) % 255)]; return $mult; } } $datamatrix=new datamatrix(); $datamatrix->data_array=array(142,164,186); print_r($datamatrix->ReedSolomon(5,array(228,48,15,111,62))); ?> i dalej nie działa, zwraca mi teraz: Array ( [4] => 0 [3] => 0 [2] => 0 [1] => 0 [0] => ) przed zmianami było tak: Array ( [4] => 1 [3] => 1 [2] => 1 [1] => [0] => 1 ) Serio nie wiem już co może być nie tak, może nie widzę jakiegoś oczywistego błędu, jakiejś literówki w nazwie zmiennej... Bardzo proszę o pomoc ;-) Ten post edytował piotr94 12.11.2009, 10:46:40 -------------------- http://www.piotr94.net21.pl/ - wykonanie stron i serwisów internetowych
Jeśli moje wypowiedzi były dla Ciebie pomocne, kliknij "Pomógł" i odwdzięcz się ;) |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Brak tematyki OOP. ->PHP
-------------------- To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness; chaotic, confused, vulnerability, to inform yourself. Think for yourself. Question authority. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 331 Pomógł: 30 Dołączył: 11.11.2008 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
dzięki za zmianę kategorii, miałem też o to prosić, bo się pomyliłem pisząc posta ;-)
Pytanie nadal aktualne;-) -------------------- http://www.piotr94.net21.pl/ - wykonanie stron i serwisów internetowych
Jeśli moje wypowiedzi były dla Ciebie pomocne, kliknij "Pomógł" i odwdzięcz się ;) |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.06.2025 - 07:39 |