📄 gf.cpp.bak
字号:
#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,239) decoder
{
FILE *fp;
int i, j, k, jj;
unsigned char s[16][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[9][8]={{0,0,0,0,0,0,0,1}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}};//gf(zeros(1,9),8,285);lambda(1)=1;
unsigned char omega[9][8]={{0,0,0,0,0,0,0,1}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}};//omega = gf(zeros(1,9),8,285);omega(1) = 1;
unsigned char delta[8];
unsigned char b[8][8]={{0,0,0,0,0,0,0,1}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}};//b=gf([1,zeros(1,7)],8);
unsigned char a[8][8]={0};//a = gf(zeros(1,8),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[17][8]={0};//lambda_tmp = gf(0,8);gf(zeros(1,17),8)
unsigned char omega_tmp[17][8]={0};//omega_tmp = gf(0,8);gf(zeros(1,17),8)
unsigned char b_tmp[17][8]={0};//b_tmp = gf(0,8);gf(zeros(1,17),8)
unsigned char a_tmp[17][8]={0};//a_tmp = gf(0,8);gf(zeros(1,17),8)
unsigned char s_tmp[16][8];
unsigned char s_tmp1[17][8] = {0};
unsigned char m1_out[17][8];
unsigned char m2_out[17][8];
unsigned char m3_out[17][8];
unsigned char m4_out[17][8];
unsigned char m5_out[17][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<=15;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]);
}
}//
for(jj=0;jj<=7;jj++)//delta=gf(s(1),8);
{
delta[jj] = s[0][jj];
}
for (i=0;i<=15;i++)//s_tmp = [s(3:16) s(1) s(2)];
{
for(jj=0;jj<=7;jj++)
{
s_tmp[i][jj] = s[(i+2)%16][jj];
}
}
printf("s_tmp: ");//
for (j=0;j<=15;j++)//测试输出
{
dec_print(s_tmp[j]);
}
printf("\n");//
for (i=1;i<=16;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<=9;j++)//s_tmp1 = [0 0 0 0 s_tmp(8:16) 0 0 0 0];
{
for (jj=0;jj<=7;jj++)
{
s_tmp1[j+3][jj] = s_tmp[j+6][jj];
}
}
for (j=0;j<=16;j++)////m1_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m1_out[j][jj] = 0;
}
}
for (j=0;j<=16;j++)////m2_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m2_out[j][jj] = 0;
}
}
for (j=0;j<=16;j++)////m3_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m3_out[j][jj] = 0;
}
}
for (j=0;j<=16;j++)////m4_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m4_out[j][jj] = 0;
}
}
for (j=0;j<=16;j++)////m5_out = 0;
{
for (jj=0;jj<=7;jj++)
{
m5_out[j][jj] = 0;
}
}
for (k=3;k<=3+9+4;k++)//for k = 1+3:9+3+1+4
{
if (k <= 12)
{
gf_multi(b[7],delta,m1_out[k]);//m1_out(k) = b(8) * delta;
gf_multi(sigema,lambda[8],m2_out[k]);//m2_out(k) = sigema * lambda(9);
if (lamida == 1)
{
for (jj=0;jj<=7;jj++)//b_tmp(k) = lambda(9);
{
b_tmp[k][jj] = lambda[8][jj];
}
}
else
{
for (jj=0;jj<=7;jj++)//b_tmp(k) = b(8);
{
b_tmp[k][jj] = b[7][jj];
}
}
for (j=7;j>=0;j--)//lambda(2:9) = lambda(1:8);
{
for (jj=0;jj<=7;jj++)
{
lambda[j+1][jj] = lambda[j][jj];
}
} //
gf_multi(a[7],delta,m4_out[k]);//m4_out(k) = a(8) * delta;%cycle1
gf_multi(sigema,omega[8],m5_out[k]);//m5_out(k) = sigema * omega(9);
if (lamida == 1)
{
for (jj=0;jj<=7;jj++)// a_tmp(k) = omega(9);
{
a_tmp[k][jj] = omega[8][jj];
}
}
else
{
for (jj=0;jj<=7;jj++)//a_tmp(k) = a(8);
{
a_tmp[k][jj] = a[7][jj];
}
}//
for (j=7;j>=0;j--)//omega(2:9) = omega(1:8);
{
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=6;j>=0;j--)//b(1:8) = [b_tmp(k-1) b(1:7)];
{
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=6;j>=0;j--)//a(1:8) = [a_tmp(k-1) a(1:7)];
{
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<=15;j++)//s_tmp = [s_tmp(2:16) 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<=8;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<=8;j++)//tmp = [1 alpha^i alpha^(2*i) alpha^(3*i) alpha^(4*i) alpha^(5*i) alpha^(6*i) alpha^(7*i) alpha^(8*i)]*lambda(1:9)';%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<=8;j++)//tmp1 = [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)]*omega(1:9)';
{
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<=8;j=j+2)//tmp2 = [alpha^(i) alpha^(3*i) alpha^(5*i) alpha^(7*i) alpha^(9*i)]*lambda([1 3 5 7 9])';
{
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");
}
}
}
/*
void main()
{
int i,j;
FILE *fp;
unsigned char a1[8] = {0, 0, 0, 0, 0, 1, 1, 1};
unsigned char b1[8] = {0, 0, 0, 1, 0, 0, 1, 0};
unsigned char c1[8] ,y1[8];
unsigned char gf_pow_table[255][8];
unsigned char gf_inverse_table[256][8];
int k=5;
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 (j=0;j<=7;j++)
fscanf(fp,"%c",&gf_pow_table[i][j]);
}
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);
}
gf_devid(a1,b1,gf_inverse_table,c1);
//gf_pow(k,gf_pow_table,c1);
// gf_add(a1,b1,c1);
gf_multi(a1,b1,y1);
for (i = 0;i<=7;i++)
{
printf("%d",c1[i]);
if (i==7)
printf("\n");
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -