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)));
?>
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.