Files
cuetools.net/CUETools.Parity/RsEncode.cs

127 lines
5.8 KiB
C#
Raw Normal View History

2010-02-18 21:12:44 +00:00
<EFBFBD><EFBFBD>using System;
using System.Collections.Generic;
using System.Text;
namespace CUETools.Parity
{
/**
* <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 RsEncode8
{
private static Galois galois = Galois81D.instance;
private int npar;
private int[] encodeGx;
public RsEncode8(int npar)
{
this.npar = npar;
encodeGx = galois.makeEncodeGx(npar);
}
/**
* 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 > galois.Max)
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);
}
}
public class RsEncode16
{
private Galois galois;
private int npar;
private int[] encodeGx;
public RsEncode16(int npar)
: this(npar, Galois16.instance)
{
}
public RsEncode16(int npar, Galois galois)
{
this.npar = npar;
this.galois = galois;
encodeGx = galois.makeEncodeGx(npar);
}
/**
* 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 unsafe void encode(ushort* data, int length, ushort* parity)
{
if (length < 0 || length + npar > galois.Max)
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
*/
ushort* wr = stackalloc ushort[npar];
for (int idx = 0; idx < length; idx++)
{
int ib = wr[0] ^ data[idx];
for (int i = 0; i < npar - 1; i++)
wr[i] = (ushort)(wr[i + 1] ^ galois.mul(ib, encodeGx[i]));
wr[npar - 1] = (ushort)galois.mul(ib, encodeGx[npar - 1]);
}
for (int i = 0; i < npar; i++)
parity[i] = wr[i];
}
public unsafe void encode(byte[] data, int datapos, int length, byte[] parity, int parityStartPos)
{
if ((length & 1) != 0)
throw new Exception("RsEncode: wrong length");
fixed (byte* bytes = &data[datapos], par = &parity[parityStartPos])
encode((ushort*)bytes, length >> 1, (ushort*)par);
}
}
}