📄 rsdec255_191.cpp
字号:
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
void gf_add(unsigned char a[], unsigned char b[],unsigned char c[])//GF域加法
{int i;
for (i=0;i<=7;i++)
{
c[i] = (a[i] + b[i])%2;
}
}//
void gf_multi(unsigned char a[], unsigned char b[],unsigned char c[])//GF域乘法
{
c[7] = (a[7] & b[7]) ^ (a[6] & b[0]) ^ (a[5] & b[1]) ^ (a[4] & b[2]) ^ (a[3] & b[3]) ^ (a[2] & b[4]) ^ (a[2] & b[0]) ^ (a[1] & b[5]) ^ (a[1] & b[1]) ^ (a[1] & b[0]) ^ (a[0] & b[6]) ^ (a[0] & b[2]) ^ (a[0] & b[1]) ^ (a[0] & b[0]) ;
c[6] = (a[7] & b[6]) ^ (a[6] & b[7]) ^ (a[5] & b[0]) ^ (a[4] & b[1]) ^ (a[3] & b[2]) ^ (a[2] & b[3]) ^ (a[1] & b[4]) ^ (a[1] & b[0]) ^ (a[0] & b[5]) ^ (a[0] & b[1]) ^ (a[0] & b[0]);
c[5] = (a[7] & b[5]) ^ (a[6] & b[6]) ^ (a[6] & b[0]) ^ (a[5] & b[7]) ^ (a[5] & b[1]) ^ (a[4] & b[2]) ^ (a[4] & b[0]) ^ (a[3] & b[3]) ^ (a[3] & b[1]) ^ (a[2] & b[4]) ^ (a[2] & b[2]) ^ (a[2] & b[0]) ^ (a[1] & b[5]) ^ (a[1] & b[3]) ^ (a[1] & b[1]) ^ (a[1] & b[0]) ^ (a[0] & b[6]) ^ (a[0] & b[4]) ^ (a[0] & b[2]) ^ (a[0] & b[1]);
c[4] = (a[7] & b[4]) ^ (a[6] & b[5]) ^ (a[6] & b[0]) ^ (a[5] & b[6]) ^ (a[5] & b[1]) ^ (a[5] & b[0]) ^ (a[4] & b[7]) ^ (a[4] & b[2]) ^ (a[4] & b[1]) ^ (a[3] & b[3]) ^ (a[3] & b[2]) ^ (a[3] & b[0]) ^ (a[2] & b[4]) ^ (a[2] & b[3]) ^ (a[2] & b[1]) ^ (a[2] & b[0]) ^ (a[1] & b[5]) ^ (a[1] & b[4]) ^ (a[1] & b[2]) ^ (a[1] & b[1]) ^ (a[0] & b[6]) ^ (a[0] & b[5]) ^ (a[0] & b[3]) ^ (a[0] & b[2]);
c[3] = (a[7] & b[3]) ^ (a[6] & b[4]) ^ (a[6] & b[0]) ^ (a[5] & b[5]) ^ (a[5] & b[1]) ^ (a[5] & b[0]) ^ (a[4] & b[6]) ^ (a[4] & b[2]) ^ (a[4] & b[1]) ^ (a[4] & b[0]) ^ (a[3] & b[7]) ^ (a[3] & b[3]) ^ (a[3] & b[2]) ^ (a[3] & b[1]) ^ (a[2] & b[4]) ^ (a[2] & b[3]) ^ (a[2] & b[2]) ^ (a[1] & b[5]) ^ (a[1] & b[4]) ^ (a[1] & b[3]) ^ (a[0] & b[6]) ^ (a[0] & b[5]) ^ (a[0] & b[4]) ^ (a[0] & b[0]);
c[2] = (a[7] & b[2]) ^ (a[6] & b[3]) ^ (a[5] & b[4]) ^ (a[5] & b[0]) ^ (a[4] & b[5]) ^ (a[4] & b[1]) ^ (a[4] & b[0]) ^ (a[3] & b[6]) ^ (a[3] & b[2]) ^ (a[3] & b[1]) ^ (a[3] & b[0]) ^ (a[2] & b[7]) ^ (a[2] & b[3]) ^ (a[2] & b[2]) ^ (a[2] & b[1]) ^ (a[1] & b[4]) ^ (a[1] & b[3]) ^ (a[1] & b[2]) ^ (a[0] & b[5]) ^ (a[0] & b[4]) ^ (a[0] & b[3]);
c[1] = (a[7] & b[1]) ^ (a[6] & b[2]) ^ (a[5] & b[3]) ^ (a[4] & b[4]) ^ (a[4] & b[0]) ^ (a[3] & b[5]) ^ (a[3] & b[1]) ^ (a[3] & b[0]) ^ (a[2] & b[6]) ^ (a[2] & b[2]) ^ (a[2] & b[1]) ^ (a[2] & b[0]) ^ (a[1] & b[7]) ^ (a[1] & b[3]) ^ (a[1] & b[2]) ^ (a[1] & b[1]) ^ (a[0] & b[4]) ^ (a[0] & b[3]) ^ (a[0] & b[2]);
c[0] = (a[7] & b[0]) ^ (a[6] & b[1]) ^ (a[5] & b[2]) ^ (a[4] & b[3]) ^ (a[3] & b[4]) ^ (a[3] & b[0]) ^ (a[2] & b[5]) ^ (a[2] & b[1]) ^ (a[2] & b[0]) ^ (a[1] & b[6]) ^ (a[1] & b[2]) ^ (a[1] & b[1]) ^ (a[1] & b[0]) ^ (a[0] & b[7]) ^ (a[0] & b[3]) ^ (a[0] & b[2]) ^ (a[0] & b[1]);
}//
void gf_pow(int order,unsigned char gf_pow_table[255][8], unsigned char pw[])//GF域乘方
{int order_255,k;
order_255 = order%255;
for (k=0;k<=7;k++)
{
pw[k] = gf_pow_table[order_255][k];
}
}//
void gf_devid(unsigned char dividend[],unsigned char divider[],unsigned char gf_inverse_table[256][8], unsigned char pw[])//GF域除法
{int index,k;
unsigned char inverse_data[8];
index = divider[0]*128 + divider[1]*64 + divider[2]*32 + divider[3]*16 + divider[4]*8 + divider[5]*4 + divider[6]*2 + divider[7];
for (k=0;k<=7;k++)
{
inverse_data[k] = gf_inverse_table[index][k];
}
gf_multi(dividend,inverse_data,pw);
}//
void dec_print(unsigned char gf_bi[])//打印十进制数
{int num_dec;
num_dec = gf_bi[0]*128 + gf_bi[1]*64 + gf_bi[2]*32 + gf_bi[3]*16 + gf_bi[4]*8 + gf_bi[5]*4 + gf_bi[6]*2 + gf_bi[7];
printf("%d ",num_dec);
}//
//void rs_dec(unsigned char data_in[255][8], unsigned char error_out[255][8])
void main()//RS(255,191) decoder
{
FILE *fp;
int i, j, k, jj;
unsigned char s[64][8];
unsigned char alpha_cf[8];
unsigned char s_mul[8];
unsigned char gf_pow_table[255][8];
unsigned char gf_inverse_table[256][8];
unsigned char data_in[255][8];
unsigned char lambda[33][8]={0};//lambda=gf(zeros(1,33),8,285);;lambda(1)=1;
unsigned char omega[33][8]={0};//omega = gf(zeros(1,33),8,285);;omega(1) = 1;
unsigned char delta[8];
unsigned char b[32][8]={0};//b=gf([1,zeros(1,31)],8);
unsigned char a[32][8]={0};//a = gf(zeros(1,32),8);
int l=0;
unsigned lamida;
unsigned char sigema[8]={0,0,0,0,0,0,0,1};//sigema = gf(1,8);
unsigned char acc[8]={0,0,0,0,0,0,0,0};//acc = gf(0,8);
unsigned char lambda_tmp[41][8]={0};//lambda_tmp = gf(0,8);gf(zeros(1,41),8)
unsigned char omega_tmp[41][8]={0};//omega_tmp = gf(0,8);gf(zeros(1,41),8)
unsigned char b_tmp[41][8]={0};//b_tmp = gf(0,8);gf(zeros(1,41),8)
unsigned char a_tmp[41][8]={0};//a_tmp = gf(0,8);gf(zeros(1,41),8)
unsigned char s_tmp[64][8];
unsigned char s_tmp1[41][8] = {0};
unsigned char m1_out[41][8];
unsigned char m2_out[41][8];
unsigned char m3_out[41][8];
unsigned char m4_out[41][8];
unsigned char m5_out[41][8];
unsigned char s_buf[8];
unsigned char tmp[8]={0};
unsigned char tmp1[8]={0};
unsigned char tmp2[8]={0};
unsigned char error_out[255][8]={0};
unsigned char chien_mul[8] = {0};
if ( (fp = fopen("gf_pow.dat","rb")) == NULL)//生成指数表
{
printf("Open file \"gf_pow.dat\" error!");
exit(1);
}
else
{
for (i = 0; i <= 254; i++)
{
for (jj=0;jj<=7;jj++)
fscanf(fp,"%c",&gf_pow_table[i][jj]);
}
fclose(fp);
}//
if ( (fp = fopen("gf_inverse.dat","rb")) == NULL)//生成求逆表
{
printf("Open file \"gf_inverse.dat\" error!");
exit(1);
}
else
{
for (i = 0; i <= 255; i++)
{
for (j=0;j<=7;j++)
fscanf(fp,"%c",&gf_inverse_table[i][j]);
}
fclose(fp);//
}
if ( (fp = fopen("dec_data_in.dat","rb")) == NULL)//读取输入数据
{
printf("Open file \"dec_data_in.dat\" error!");
exit(1);
}
else
{
for (i = 0; i <= 254; i++)
{
for (j=0;j<=7;j++)
fscanf(fp,"%c",&data_in[i][j]);
}
fclose(fp);
}//
//////////////////////////////////////////////////////////////////////////////////
for (i=0;i<=254;i++)//伴随多项式计算
{
for (j=0;j<=63;j++)
{ gf_pow(j+1,gf_pow_table,alpha_cf);
gf_multi(s[j],alpha_cf,s_mul);
gf_add(s_mul,data_in[i],s[j]);
}
}//
/////////////////////////////////////////////////////////////////////////////////////////
lambda[0][7] = 1;//lambda(1)=1;
omega[0][7] = 1; //omega(1) = 1;
b[0][7] = 1;//b(1) = 1;
for(jj=0;jj<=7;jj++)//delta=gf(s(1),8);
{
delta[jj] = s[0][jj];
}
for (i=0;i<=63;i++)//s_tmp = [s(3:64) s(1) s(2)];
{
for(jj=0;jj<=7;jj++)
{
s_tmp[i][jj] = s[(i+2)%64][jj];
}
}
printf("s_tmp: ");//
for (j=0;j<=63;j++)//测试输出
{
dec_print(s_tmp[j]);
}
printf("\n");//
for (i=1;i<=64;i++)//main BM
{
if ((2*l <= i-1)&&((delta[0]*128 + delta[1]*64 + delta[2]*32 + delta[3]*16 + delta[4]*8 + delta[5]*4 + delta[6]*2 + delta[7]) != 0))
lamida = 1;
else
lamida = 0;
l = lamida*(i-l)+(1-lamida)*l;
for (j= 1;j<=33;j++)//s_tmp1 = [0 0 0 0 s_tmp(32:64) 0 0 0 0];
{
for (jj=0;jj<=7;jj++)
{
s_tmp1[j+3][jj] = s_tmp[j+30][jj];
}
}
for (j=0;j<=40;j++)////m1_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m1_out[j][jj] = 0;
}
}
for (j=0;j<=40;j++)////m2_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m2_out[j][jj] = 0;
}
}
for (j=0;j<=40;j++)////m3_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m3_out[j][jj] = 0;
}
}
for (j=0;j<=40;j++)////m4_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m4_out[j][jj] = 0;
}
}
for (j=0;j<=40;j++)////m5_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m5_out[j][jj] = 0;
}
}
for (k=3;k<=3+33+4;k++)//for k = 1+3:9+3+1+4
{
if (k <= 36)
{
gf_multi(b[31],delta,m1_out[k]);//m1_out(k) = b(32) * delta;
gf_multi(sigema,lambda[32],m2_out[k]);//m2_out(k) = sigema * lambda(33);
if (lamida == 1)
{
for (jj=0;jj<=7;jj++)//b_tmp(k) = lambda(33);
{
b_tmp[k][jj] = lambda[32][jj];
}
}
else
{
for (jj=0;jj<=7;jj++)//b_tmp(k) = b(32);
{
b_tmp[k][jj] = b[31][jj];
}
}
for (j=31;j>=0;j--)//lambda(2:33) = lambda(1:32);
{
for (jj=0;jj<=7;jj++)
{
lambda[j+1][jj] = lambda[j][jj];
}
} //
gf_multi(a[31],delta,m4_out[k]);//m4_out(k) = a(32) * delta;%cycle1
gf_multi(sigema,omega[32],m5_out[k]);//m5_out(k) = sigema * omega(33);
if (lamida == 1)
{
for (jj=0;jj<=7;jj++)//a_tmp(k) = omega(33);
{
a_tmp[k][jj] = omega[32][jj];
}
}
else
{
for (jj=0;jj<=7;jj++)//a_tmp(k) = a(32);
{
a_tmp[k][jj] = a[31][jj];
}
}//
for (j=31;j>=0;j--)//omega(2:33) = omega(1:32);
{
for (jj=0;jj<=7;jj++)
{
omega[j+1][jj] = omega[j][jj];
}
}
gf_add(m1_out[k-1],m2_out[k-1],lambda[0]);//lambda(1)= m1_out(k-1)+ m2_out(k-1);
for (j=30;j>=0;j--)//b(1:32) = [b_tmp(k-1) b(1:31)];
{
for (jj=0;jj<=7;jj++)
{
b[j+1][jj] = b[j][jj];
}
}
for (jj=0;jj<=7;jj++)
{
b[0][jj] = b_tmp[k-1][jj];
}
gf_add(m4_out[k-1],m5_out[k-1],omega[0]);//omega(1)= m4_out(k-1)+ m5_out(k-1);
for (j=30;j>=0;j--)//a(1:32) = [a_tmp(k-1) a(1:31)];
{
for (jj=0;jj<=7;jj++)
{
a[j+1][jj] = a[j][jj];
}
}
for (jj=0;jj<=7;jj++)
{
a[0][jj] = a_tmp[k-1][jj];
}
}
gf_add(m1_out[k-1],m2_out[k-1],lambda_tmp[k]);//lambda_tmp(k) = m1_out(k-1)+ m2_out(k-1);
gf_add(m4_out[k-1],m5_out[k-1],omega_tmp[k]);//omega_tmp(k) = m4_out(k-1)+ m5_out(k-1);
gf_multi(s_tmp1[k-1],lambda_tmp[k-1],m3_out[k]);//m3_out(k) = s_tmp1(k-1)*lambda_tmp(k-1);%cycle3
gf_add(acc,m3_out[k-3],acc);//acc = acc + m3_out(k-3); %cycle4
}
for (jj=0;jj<=7;jj++)
{
s_buf[jj] = s_tmp[0][jj];
}
for (j=1;j<=63;j++)//s_tmp = [s_tmp(2:64) s_tmp(1)];
{
for (jj=0;jj<=7;jj++)
{
s_tmp[j-1][jj] = s_tmp[j][jj];
}
}
for (jj=0;jj<=7;jj++)
{
s_tmp[15][jj] = s_buf[jj];
}
if (lamida == 1)//sigema = lamida*delta + (1-lamida)*sigema;
{
for (jj=0;jj<=7;jj++)//sigema = delta;
{
sigema[jj] = delta[jj];
}
}
for (jj=0;jj<=7;jj++)//delta = acc;
{
delta[jj] = acc[jj];
}
for (jj=0;jj<=7;jj++)//acc = 0;
{
acc[jj] = 0;
}
}
printf("lambda: ");//
for (j=0;j<=32;j++)//测试输出
{
dec_print(lambda[j]);
}
printf("\n");//
/////////////////////////////////////////////////////////////////////////////////////////////////
for (i=1;i<=255;i++)
{
for (jj=0;jj<=7;jj++)//tmp = 0;
{
tmp[jj] = 0;
}
for (j=0;j<=32;j++)//[1 alpha^i alpha^(2*i) alpha^(3*i) alpha^(4*i) alpha^(5*i) alpha^(6*i) alpha^(7*i) alpha^(8*i) alpha^(9*i) alpha^(10*i) alpha^(11*i) alpha^(12*i) alpha^(13*i) alpha^(14*i) alpha^(15*i) alpha^(16*i) alpha^(17*i) alpha^(18*i) alpha^(19*i) alpha^(20*i) alpha^(21*i) alpha^(22*i) alpha^(23*i) alpha^(24*i) alpha^(25*i) alpha^(26*i) alpha^(27*i) alpha^(28*i) alpha^(29*i) alpha^(30*i) alpha^(31*i) alpha^(32*i)]*lambda';%chien搜索,错误位置计算
{
gf_pow(j*i,gf_pow_table,alpha_cf);
gf_multi(lambda[j],alpha_cf,chien_mul);
gf_add(tmp,chien_mul,tmp);
}
if ( (tmp[0]*128 + tmp[1]*64 + tmp[2]*32 + tmp[3]*16 + tmp[4]*8 + tmp[5]*4 + tmp[6]*2 + tmp[7]) == 0)
{
for (jj=0;jj<=7;jj++)//tmp1 = 0;
{
tmp1[jj] = 0;
}
for (j=0;j<=32;j++)//[alpha^(i) alpha^(2*i) alpha^(3*i) alpha^(4*i) alpha^(5*i) alpha^(6*i) alpha^(7*i) alpha^(8*i) alpha^(9*i) alpha^(10*i) alpha^(11*i) alpha^(12*i) alpha^(13*i) alpha^(14*i) alpha^(15*i) alpha^(16*i) alpha^(17*i) alpha^(18*i) alpha^(19*i) alpha^(20*i) alpha^(21*i) alpha^(22*i) alpha^(23*i) alpha^(24*i) alpha^(25*i) alpha^(26*i) alpha^(27*i) alpha^(28*i) alpha^(29*i) alpha^(30*i) alpha^(31*i) alpha^(32*i) alpha^(33*i)]*omega(1:33)';
{
gf_pow((j+1)*i,gf_pow_table,alpha_cf);
gf_multi(omega[j],alpha_cf,chien_mul);
gf_add(tmp1,chien_mul,tmp1);
}
for (jj=0;jj<=7;jj++)//tmp2 = 0;
{
tmp2[jj] = 0;
}
for (j=0;j<=32;j=j+2)//[alpha^(1*i) alpha^(3*i) alpha^(5*i) alpha^(7*i) alpha^(9*i) alpha^(11*i) alpha^(13*i) alpha^(15*i) alpha^(17*i) alpha^(19*i) alpha^(21*i) alpha^(23*i) alpha^(25*i) alpha^(27*i) alpha^(29*i) alpha^(31*i) alpha^(33*i)]*lambda([1:2:33])';
{
gf_pow((j+1)*i,gf_pow_table,alpha_cf);
gf_multi(lambda[j],alpha_cf,chien_mul);
gf_add(tmp2,chien_mul,tmp2);
}
gf_devid(tmp1,tmp2,gf_inverse_table,error_out[i]);//error_out(i) = tmp1/tmp2;%错误值计算
printf("错误位置%d 错误值",i);
dec_print(error_out[i]);
printf("\n");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -