Files
cuetools.net/CUETools.Ripper.SCSI/RsEncode.cs

84 lines
3.9 KiB
C#
Raw Normal View History

2008-12-03 21:42:22 +00:00
<EFBFBD><EFBFBD>using System;
using System.Collections.Generic;
using System.Text;
namespace CUETools.Ripper.SCSI
{
/**
* <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0: RS<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
*
* @author Masayuki Miyazaki
* http://sourceforge.jp/projects/reedsolomon/
*/
public class RsEncode
{
private static Galois galois = Galois.instance;
private int npar;
private int[] encodeGx;
/**
* ubY<EFBFBD>_M<EFBFBD>Rn0\Ob
* G(x)=<EFBFBD>[k=0,n-1](x + <EFBFBD>^k)
* encodeGxn0<EFBFBD>mH0W[h0!kpen0&Ns0L0<EFBFBD>j0n0k0<EFBFBD>la
* encodeGx[0] = x^(npar - 1)n0<EFBFBD>
* encodeGx[1] = x^(npar - 2)n0<EFBFBD>
* ...
* encodeGx[npar - 1] = x^0n0<EFBFBD>
*/
public RsEncode(int npar)
{
this.npar = npar;
encodeGx = new int[npar];
encodeGx[npar - 1] = 1;
for (int kou = 0; kou < npar; kou++)
{
int ex = galois.toExp(kou); // ex = <EFBFBD>^kou
// (x + <EFBFBD>^kou)<EFBFBD>0<EFBFBD>c<EFBFBD>0
for (int i = 0; i < npar - 1; i++)
{
// <EFBFBD>s(Wn0<EFBFBD> * <EFBFBD>^kou + Nd0 Nn0!kpen0<EFBFBD>
encodeGx[i] = galois.mul(encodeGx[i], ex) ^ encodeGx[i + 1];
}
encodeGx[npar - 1] = galois.mul(encodeGx[npar - 1], ex); // g NMO<EFBFBD>n0<EFBFBD><EFBFBD>{
}
}
/**
* RS<EFBFBD>0<EFBFBD>0<EFBFBD>0n0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
*
* @param data int[]
* eQ<EFBFBD>R<EFBFBD>0<EFBFBD>0<EFBFBD>0M<EFBFBD>R
* @param length int
* eQ<EFBFBD>R<EFBFBD>0<EFBFBD>0<EFBFBD>0w<EFBFBD>
* @param parity int[]
* <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<h }(uM<EFBFBD>R
* @param parityStartPos int
* <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<h }(uIndex
* @return bool
*/
public void encode(byte[] data, int datapos, int length, byte[] parity, int parityStartPos)
{
if (length < 0 || length + npar > 255)
throw new Exception("RsEncode: wrong length");
/*
* <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<h }(uM<EFBFBD>R
* wr[0] g
NMO
* wr[npar - 1] g NMO j0n0k0<EFBFBD>la
* S0<EFBFBD>0g0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD><EFBFBD>k0&Ny0K0H0j0O0f0<EFBFBD>0D0n0g00arraycopyL0OH0<EFBFBD>0
*/
byte[] wr = new byte[npar];
for (int idx = datapos; idx < datapos + length; idx++)
{
int ib = wr[0] ^ data[idx];
for (int i = 0; i < npar - 1; i++)
wr[i] = (byte)(wr[i + 1] ^ galois.mul(ib, encodeGx[i]));
wr[npar - 1] = (byte)galois.mul(ib, encodeGx[npar - 1]);
}
if (parity != null)
Array.Copy(wr, 0, parity, parityStartPos, npar);
}
}
}