文字列をReed Solomon(リード ソロモン)符号で符号化、複合化します。
こちらで実装した、Reed Solomon符号化を用いて、
文字列をReed Solomon(リード ソロモン)符号で符号化します。
Windows Formアプリケーションを作成します。
下図のフォームを作成します。
下記コードを記述します。button1, button2 のクリックイベントを実装します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using iPentec.ReedSolomonCodec;
namespace SimpleErrorCorrect
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
byte[] data = new byte[2550];
data[0] = (byte)'P';
data[1] = (byte)'e';
data[2] = (byte)'n';
data[3] = (byte)'g';
data[4] = (byte)'u';
data[5] = (byte)'i';
data[6] = (byte)'n';
data[7] = (byte)'C';
data[8] = (byte)'o';
data[9] = (byte)'o';
data[10] = (byte)'k';
data[11] = (byte)'i';
data[12] = (byte)'e';
byte[] encdata = new byte[2550];
//エンコードする
iPentecReedSolomon iprs = new iPentecReedSolomon(8, 32);
iprs.EncodeRS(ref data, ref encdata);
for (int i = 0; i < encdata.Length; i++)
{
textBox1.Text += (char)encdata[i];
}
//エラー追加
encdata[12] = (byte)'e';
encdata[13] = (byte)'e';
encdata[14] = (byte)'e';
encdata[15] = (byte)'e';
encdata[16] = (byte)'e';
encdata[17] = (byte)'e';
encdata[18] = (byte)'e';
//encdata[10] = (byte)'e';
//encdata[11] = (byte)'e';
encdata[32] = (byte)'e';
encdata[33] = (byte)'e';
encdata[34] = (byte)'e';
encdata[35] = (byte)'e';
encdata[36] = (byte)'e';
encdata[37] = (byte)'e';
for (int i = 0; i < encdata.Length; i++)
{
textBox2.Text += (char)encdata[i];
}
byte[] decdata = new byte[2550];
iprs.DecodeRS(ref encdata, ref decdata);
for (int i = 0; i < encdata.Length; i++)
{
textBox3.Text += (char)decdata[i];
}
}
private void FormMain_Load(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
byte[] par = new byte[2550];
byte[] data = new byte[2550];
data[0] = (byte)'P';
data[1] = (byte)'e';
data[2] = (byte)'n';
data[3] = (byte)'g';
data[4] = (byte)'u';
data[5] = (byte)'i';
data[6] = (byte)'n';
data[7] = (byte)'C';
data[8] = (byte)'o';
data[9] = (byte)'o';
data[10] = (byte)'k';
data[11] = (byte)'i';
data[12] = (byte)'e';
byte[] encdata = new byte[2550];
//エンコードする
iPentecReedSolomon iprs = new iPentecReedSolomon(8, 32);
iprs.EncodeRSEx(ref data, ref encdata, ref par);
for (int i = 0; i < encdata.Length; i++)
{
textBox1.Text += (char)encdata[i];
}
//エラー追加
data[3] = (byte)'E';
data[4] = (byte)'E';
data[5] = (byte)'E';
data[6] = (byte)'E';
data[7] = (byte)'E';
data[8] = (byte)'E';
data[9] = (byte)'E';
data[10] = (byte)'E';
data[11] = (byte)'E';
data[12] = (byte)'E';
for (int i = 0; i < data.Length; i++)
{
textBox2.Text += (char)data[i];
}
byte[] decdata = new byte[2550];
iprs.DecodeRSEx(ref data, ref par, ref decdata);
for (int i = 0; i < decdata.Length; i++)
{
textBox3.Text += (char)decdata[i];
}
}
}
}
"PenguinCookie" という文字列(バイトデータ)をReed-Solomon符号で符号化し、パリティを含めて符号化したデータの
13~19バイト、33~38バイトにエラー加えます。'e'の値でデータを上書きして壊します。エラーを含んだデータを復号し、結果をテキストボックスに表示します。
"PenguinCookie" という文字列(バイトデータ)をReed-Solomon符号で符号化し、元データの
4~13バイトにエラー加えます。'E'の値でデータを上書きして壊します。なお、パリティにはエラーを加えません。エラーを含んだデータを復号し、結果をテキストボックスに表示します。
プロジェクトを実行します。下図のフォームが表示されます。
[button1]をクリックします。[エンコードデータ]に ReedSolomonで符号化されたエンコードデータが表示されます。
[エラー追加データ]には、'e'のエラーで壊れたデータが表示されます。[デコード後データ]は、エラー追加データの値からデコードした結果のデータが表示されます。
エラーが訂正されて、エンコードデータと同じ値になっていることが確認できます。
[button2]をクリックします。こちらは、元のデータのみにエラーを追加し、パリティにはエラーを追加しない例です。
こちらの場合でも、エラーが訂正されて元のデータが復元できていることが確認できます。
こちらを参考にしております。理論などの解説も下記書籍からどうぞ。