Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [algorytm] Reed-Solomon w php (i datamatrix)
Forum PHP.pl > Forum > PHP
piotr94
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.
darko
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.
piotr94
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 ;-)
Cysiaczek
Brak tematyki OOP. ->PHP
piotr94
dzięki za zmianę kategorii, miałem też o to prosić, bo się pomyliłem pisząc posta ;-)
Pytanie nadal aktualne;-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.