📄 main.c
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "rs_11_0_4.h"
#define rs_9_2_4 0
static const unsigned char GF[16]={0,1,2,4,8,3,6,12,11,5,10,7,14,15,13,9};
static const unsigned char ID[16]={0,1,2,5,3,9,6,11,4,15,10,8,7,14,12,13};
static const unsigned char pow2[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
static unsigned char mul_rs(unsigned char a,unsigned char b);
static unsigned char div_rs(unsigned char a,unsigned char b);
static unsigned char rs_check(unsigned char a);
static void rs_coder(unsigned char a[]);
static void rs_xcoder(unsigned char a[]);
static void mod_rs(unsigned char a[],unsigned char b[]);
void mod_rs(unsigned char a[],unsigned char b[])
{
signed int k,n;
signed int i,j;
for(i=0;i<11;i++)
{
if(a[i]!=0)
{
if(ID[a[i]]==ID[b[0]])
k=0;
else if(ID[a[i]]>ID[b[0]])
k=1+ID[a[i]]-ID[b[0]];
else
k=16-(ID[a[i]]-ID[b[0]]);
for(j=0;j<5;j++)
{
if((k==0)||(ID[b[j]]==0))
n=ID[b[j]];
else
{
n=(k-1+ID[b[j]]-1)%15;
if(n<0) n+=15;
n++;
}
a[i+j] = a[i+j]^GF[n];
}
} /* if */
} /* for i */
}
unsigned char mul_rs(unsigned char a,unsigned char b)
{
signed int k;
if((ID[a]==0)||(ID[b]==0))
k=0;
else
{
k=(ID[a]-1+ID[b]-1)%15;
if(k<0) k += 15;
k++;
}
return GF[k];
}
unsigned char div_rs(unsigned char a,unsigned char b)
{
signed int k;
int m,n;
m = ID[a];
n = ID[b];
if((ID[a]==0)||(ID[b]==0))
k=0;
else
{
k= (m-n)%15;
if(k<0) k+=15;
k++;
}
return GF[k];
}
unsigned char rs_check(unsigned char b)
{
signed int i;
signed int count;
count = 0;
for(i=0;i<8;i++)
{
if(b&pow2[i]) count ++;
} /* for i */
return count%2 ;
}
void rs_decode_11_0_4(unsigned char *src,unsigned char *dest)
{
unsigned char b[15];
unsigned char c[30];
unsigned char d[15];
unsigned char e[30];
signed int i;
for(i=0;i<15;i++)
b[i]=src[i];
for(i=0;i<15;i++)
{
#if rs_9_2_4
c[2*i] = b[i]/16;
c[2*i+1] = b[i]%16;
#elif rs_11_0_4
c[2*i] = b[i]%16;
c[2*i+1] = b[i]/16;
#endif
}
for(i=0;i<11;i++)
d[i]=c[i];
for(i=11;i<15;i++)
d[i]=c[11+i];
rs_xcoder(d);
for(i=0;i<11;i++)
e[i]=d[i];
for(i=0;i<11;i++)
d[i]=c[11+i];
for(i=11;i<15;i++)
d[i]=c[15+i];
rs_xcoder(d);
for(i=0;i<11;i++)
e[11+i]=d[i];
for(i=0;i<11;i++)
#if rs_9_2_4
dest[i]=e[2*i]*16 + e[2*i+1];
#elif rs_11_0_4
dest[i]=e[2*i] + e[2*i+1]*16;
#endif
}
void rs_encode_11_0_4(unsigned char *src,unsigned char *dest)
{
signed int i;
unsigned char b[15];
unsigned char c[22];
unsigned char d[15];
#if rs_9_2_4
b[9]=0;
for(i=0;i<9;i++)
{
b[i] = src[i];
if( (i<8)&&rs_check(b[i]) )
b[9] = b[9] + pow2[i];
}
b[10]=rs_check(b[8]);
#elif rs_11_0_4
for(i=0;i<11;i++)
{
b[i] = src[i];
}
#endif
for(i=0;i<11;i++)
{
#if rs_9_2_4
c[2*i] = b[i]/16;
c[2*i+1] = b[i]%16;
#elif rs_11_0_4
c[2*i] = b[i]%16;
c[2*i+1] = b[i]/16;
#endif
}
for(i=0;i<11;i++)
d[i] = c[i];
rs_coder(d);
#if rs_9_2_4
b[11] = d[11]*16 + d[12];
b[12] = d[13]*16 + d[14];
#elif rs_11_0_4
b[11] = d[12]*16 + d[11];
b[12] = d[14]*16 + d[13];
#endif
for(i=11;i<22;i++)
d[i-11] = c[i];
rs_coder(d);
#if rs_9_2_4
b[13] = d[11]*16 + d[12];
b[14] = d[13]*16 + d[14];
#elif rs_11_0_4
b[13] = d[12]*16 + d[11];
b[14] = d[14]*16 + d[13];
#endif
for(i=0;i<15;i++)
dest[i]=b[i];
}
void rs_coder(unsigned char a[])
{
unsigned char b[5]={1,13,12,8,7};
unsigned char c[15];
unsigned char i;
for(i=0;i<11;i++)
c[i] = a[i];
for(i=11;i<15;i++)
c[i] = 0;
mod_rs(c,b);
for(i=11;i<15;i++)
a[i]=c[i];
}
void rs_xcoder(unsigned char a[])
{
unsigned char i,j;
unsigned char s[4];
unsigned char dz[3];
unsigned char ew[2];
unsigned char x[2];
int k;
for(i=0;i<4;i++)
{
s[i]=0x0;
for(j=0;j<15;j++)
{
if(a[j]!=0){
k = ID[a[j]]-1+((i+1)*(14-j));
k = k%15;
if(k<0) k+=15;
k++;
s[i]=s[i]^GF[k];
} /* if a!=0 */
} /* for j */
} /* for i */
j = 0;
for(i=0;i<4;i++)
{
if(s[i]!=0)
{
j = 1;
break;
}
} /* for */
dz[2] = mul_rs(s[0],s[2]) ^ mul_rs(s[1],s[1]);
dz[1] = mul_rs(s[0],s[3]) ^ mul_rs(s[1],s[2]);
dz[0] = mul_rs(s[2],s[2]) ^ mul_rs(s[1],s[3]);
if(dz[2]==0)
{
if( (dz[1]!=0)||(s[0]==0)||
(s[1]==0)||(s[2]==0)||(s[3]==0) ) ;
else{
x[0] = div_rs(s[1],s[0]);
ew[0]= mul_rs(s[0],s[0]);
ew[0]= div_rs(ew[0],s[1]);
i = ID[x[0]] - 1;
a[14-i] ^= ew[0];
}
}
else{
if( (dz[1]==0)||(dz[0]==0) ){
;
}
else{
k = 0;
for(i=0;i<16;i++)
{
j = mul_rs(dz[2],mul_rs(GF[i],GF[i]));
j = j ^ mul_rs(dz[1],GF[i]);
j = j ^ dz[0];
if(j==0){
x[0] = GF[i+1];
break;
}
}
x[1] = div_rs(dz[1],dz[2]) ^ x[0];
}
i = mul_rs(x[0],x[1]) ^ mul_rs(x[0],x[0]);
ew[0] = mul_rs(s[0],x[1]) ^ s[1];
ew[0] = div_rs(ew[0],i);
i = mul_rs(x[0],x[1]) ^ mul_rs(x[1],x[1]);
ew[1] = mul_rs(s[0],x[0]) ^ s[1];
ew[1] = div_rs(ew[1],i);
if(ID[x[0]]<1) i = 0;
else i = ID[x[0]] - 1;
a[14-i] ^= ew[0];
if(ID[x[1]]<1) i = 0;
else i = ID[x[1]] - 1;
a[14-i] ^= ew[1];
}
}
void main(void)
{
unsigned char enbuf1[15];
unsigned char enbuf[]={0x3c,0x4a,0x61,0x41,0x3c,0x77,0xa0,0xb1,0xc3,0xe3,0xf9};
unsigned char debuf1[11];
unsigned char debuf[]={0x3c,0x4a,0x61,0x41,0x3c,0x77,0xa0,0xb1,0xc3,0xe3,0xf9,0xf9,0x95,0x41,0x80};
rs_encode_11_0_4(enbuf,enbuf1);
rs_decode_11_0_4(debuf,debuf1);
EnableInterrupts; /* enable interrupts */
/* include your code here */
for(;;) {
__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -