/** * 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; }
/** * 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; }