文字列をReed Solomon (リード ソロモン符号)で符号化する (Delphi版) - Delphi

こちらで実装した、Reed Solomon符号化を用いて、 文字列をReed Solomon(リード ソロモン)符号で符号化します。

下図のフォームをデザインします。


ボタンのClickイベントに下記のコードを記述します。
コードの内容は"penguin"という文字列をReed-Solomon符号で符号化し、符号化したデータの9~14バイトにかけてエラーを付け加えます。エラーを含んだデータを複合し、複合された結果をテキストボックスに表示します。

ボタン1 (エンコード結果にエラーを追加してデコードする)

procedure TForm1.Button2Click(Sender: TObject);
var
  i:integer;
  data:array [0..2550] of byte;
  enc:array [0..2550] of byte;
  dec:array [0..2550] of byte;
  pri:array [0..2550] of byte;
  p:PChar;

begin
  Zeromemory(@data,2550);
  Zeromemory(@enc,2550);
  Zeromemory(@dec,2550);

  //初期化してデータを入れる
  for i:=0 to 255 do data[i]:=0;
  data[0]:=Ord('p');
  data[1]:=Ord('e');
  data[2]:=Ord('n');
  data[3]:=Ord('g');
  data[4]:=Ord('u');
  data[5]:=Ord('i');
  data[6]:=Ord('n');

  //エンコードする
  iPentecReedSolomon1.EncodeRS(data,enc);

  p:=pChar(@enc[0]);
  Edit6.Text:=p;

  //エラーを作る
//  enc[15]:=ord('a');
//  enc[16]:=ord('a');
//  enc[17]:=ord('a');
//  enc[17]:=ord('a');
  enc[9]:=ord('a');
  enc[10]:=ord('j');
  enc[11]:=ord('r');
//  enc[12]:=ord('a');
//  enc[13]:=ord('j');
//  enc[14]:=ord('r');
//  enc[12]:=ord('r');
//  enc[10]:=28;
//  enc[11]:=28;

  p:=pChar(@enc[0]);
  Edit2.Text:=p;

  //デコードする
  iPentecReedSolomon1.DecodeRS(enc,dec);
  p:=pChar(@dec[0]);
  Edit3.Text:=p;
end;

ボタン2 (パリティとデータを分けて、元データにエラーを追加して訂正する)

procedure TForm1.Button3Click(Sender: TObject);
var
  i:integer;
  data:array [0..2550] of byte;
  enc:array [0..2550] of byte;
  dec:array [0..2550] of byte;
  par:array [0..2550] of byte;
  p:PChar;
begin
  Zeromemory(@data,2550);
  Zeromemory(@enc,2550);
  Zeromemory(@dec,2550);

  for i:=0 to 2550 do begin
    data[i]:=0;//random(255);
  end;
  data[0]:=Ord('p');
  data[1]:=Ord('e');
  data[2]:=Ord('n');
  data[3]:=Ord('g');
  data[4]:=Ord('u');
  data[5]:=Ord('i');
  data[6]:=Ord('n');

  iPentecReedSolomon1.EncodeRSEx(data,enc,par);

  p:=pChar(@enc[0]);
  Edit6.Text:=p;

  //エラーを作成する
  data[0] := ord('H');
  data[1] := ord('o');

  p:=pChar(@enc[0]);
  Edit2.Text:=p;

  iPentecReedSolomon1.DecodeRSEx(data,par,dec);
  p:=pChar(@dec[0]);
  Edit3.Text:=p;

end;
実行すると下図の結果となります

エラーが訂正されていることがわかります。

参考・出展

こちらを参考にしております。理論などの解説も下記書籍からどうぞ。

著者
iPentec Document 編集部
iPentec Document 編集部です。
快適な生活のための情報、価値のある体験やレビューを提供します。
最終更新日: 2024-01-24
作成日: 2010-01-22
iPentec all rights reserverd.