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

文字列をReed Solomon(リード ソロモン)符号で符号化、複合化します。

概要

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

プログラム

Windows Formアプリケーションを作成します。

UI

下図のフォームを作成します。
文字列をReed Solomon (リード ソロモン符号)で符号化する (C#版):画像1

コード

下記コードを記述します。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];
      }
    }
  }
}

解説

button1

"PenguinCookie" という文字列(バイトデータ)をReed-Solomon符号で符号化し、パリティを含めて符号化したデータの 13~19バイト、33~38バイトにエラー加えます。'e'の値でデータを上書きして壊します。エラーを含んだデータを復号し、結果をテキストボックスに表示します。

button2

"PenguinCookie" という文字列(バイトデータ)をReed-Solomon符号で符号化し、元データの 4~13バイトにエラー加えます。'E'の値でデータを上書きして壊します。なお、パリティにはエラーを加えません。エラーを含んだデータを復号し、結果をテキストボックスに表示します。

実行結果

プロジェクトを実行します。下図のフォームが表示されます。
文字列をReed Solomon (リード ソロモン符号)で符号化する (C#版):画像2

[button1]をクリックします。[エンコードデータ]に ReedSolomonで符号化されたエンコードデータが表示されます。 [エラー追加データ]には、'e'のエラーで壊れたデータが表示されます。[デコード後データ]は、エラー追加データの値からデコードした結果のデータが表示されます。
エラーが訂正されて、エンコードデータと同じ値になっていることが確認できます。
文字列をReed Solomon (リード ソロモン符号)で符号化する (C#版):画像3

[button2]をクリックします。こちらは、元のデータのみにエラーを追加し、パリティにはエラーを追加しない例です。 こちらの場合でも、エラーが訂正されて元のデータが復元できていることが確認できます。

文字列をReed Solomon (リード ソロモン符号)で符号化する (C#版):画像4

参考・出展

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


AuthorPortraitAlt
著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
作成日: 2010-01-25
改訂日: 2022-06-06
Copyright © 1995–2025 iPentec all rights reserverd.