⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 RS编码 CodeWarrior环境例程!
💻 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 + -