Beispiel #1
0
/**
 * RS码的解码
 *
 * @param data int[]
 *		数据输入数组
 * @param length int
 * 		数据长度,包括校验
 * @param noCorrect boolean
 * 		只检查,不纠错
 * @return int
 * 		0: 无错误
 * 		> 0: 纠正了个别错误的返回值
 * 		< 0: 不能纠正
 */
int RsDecode::decode(BYTE * data, int length, boolean noCorrect)
{
	if(length < npar || length > 255) {
		return RS_PERM_ERROR;
	}
	// 综合计算
	int * syn = new int[npar];
	for(int i=0;i<npar;i++)syn[i]=0;

	if(galois.calcSyndrome(data, length, syn, npar)) {
		return 0;		// 无措
	}
	//  求出σ和ω
	int * sigma = new int[npar/2+2];
	for(int i=0;i<npar/2+2;i++)sigma[i]=0;
	int * omega = new int[npar/2+1];
	for(int i=0;i<npar/2+1;i++)omega[i]=0;
	int jisu = calcSigmaMBM(sigma, omega, syn);
	if(jisu <= 0) {
		return RS_CORRECT_ERROR;
	}
	// 通过探索求出错误的位置
	int * pos = new int[jisu];
	for(int i=0;i<jisu;i++)pos[i]=0;

	int r = chienSearch(pos, length, jisu, sigma);
	if(r < 0) {
		return r;
	}
	if(!noCorrect) {
		// 纠错
		doForney(data, length, jisu, pos, sigma, omega);
	}
	return jisu;
}
Beispiel #2
0
/**
 * RSコードのデコード
 *
 * @param data int[]
 *		入力データ配列
 * @param length int
 * 		パリティを含めたデータ長
 * @param noCorrect boolean
 * 		チェックのみで訂正は行わない
 * @return int
 * 		0: エラーなし
 * 		> 0: 戻り値個の誤りを訂正した
 * 		< 0: 訂正不能
 */
int RsDecode::decode(BYTE * data, int length, bool noCorrect)
{
	int i;
	if(length < npar || length > 255) {
		return RS_PERM_ERROR;
	}
	int * syn = new int[npar];
	for(i=0;i<npar;i++)syn[i]=0;

	if(galois.calcSyndrome(data, length, syn, npar)) {
		return 0;		
	}
	int * sigma = new int[npar/2+2];
	for(i=0;i<npar/2+2;i++)sigma[i]=0;
	int * omega = new int[npar/2+1];
	for(i=0;i<npar/2+1;i++)omega[i]=0;
	int jisu = calcSigmaMBM(sigma, omega, syn);
	if(jisu <= 0) {
		return RS_CORRECT_ERROR;
	}
	int * pos = new int[jisu];
	for(i=0;i<jisu;i++)pos[i]=0;

	int r = chienSearch(pos, length, jisu, sigma);
	if(r < 0) {
		return r;
	}
	if(!noCorrect) {
		doForney(data, length, jisu, pos, sigma, omega);
	}
	if(syn)
		delete [] syn;
	if(sigma)
		delete [] sigma;
	if(omega)
		delete [] omega;
	if(pos)
		delete [] pos;
	return jisu;
}