当前位置: 首页 > news >正文

福田公司名称及地址宜昌seo优化服务

福田公司名称及地址,宜昌seo优化服务,免费的行情软件app网站,石家庄网页设计的公司ECC的代码实现 数据校验介绍:  通俗的说#xff0c;就是为保证数据的完整性#xff0c;用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值#xff0c;如果和随数据提供的校验值一样#xff0c;就说明数据是完整的。 如果是时序或者电路方…ECC的代码实现 数据校验介绍:  通俗的说就是为保证数据的完整性用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值如果和随数据提供的校验值一样就说明数据是完整的。 如果是时序或者电路方面有什么问题的话错误数据的发生是无法通过数据校验来进行弥补的而对于受外界干扰而产生的位翻转错误则可以一定程度上通过HW或者SW的数据校验来进行数据的检测和纠正。 常用的数据校验算法有CRC校验和ECC校验等,它们的基本原理很相似。 ECC介绍: ECC(错误检查和纠正),这种技术也是在原来的数据位上外加校验位来实现的,具体的原理不再描述,大致的描述可以参照http://blog.csdn.net/nhczp/archive/2007/07/20/1700031.aspx. 它有一个规律数据位每增加一倍ECC只增加一位检验位也就是说当数据位为16位时ECC位为6位32位时ECC位为7位数据位为64位时ECC位为8位依此类推数据位每增加一倍ECC位只增加一位。 附件说明: 附件1:256字节ECC校正1比特错误代码实现 附件2:512字节ECC校正1比特错误代码实现 /*************************************************************************************************************/ 附件1:256字节ECC校正1比特错误代码实现 // 256ByteECC071123.cpp : Defines the entry point for the console application.// #include stdafx.h#include stdio.h //071126unsigned char dat[]{0x0  ,0x0 ,0x0 ,0x0  ,0x0 ,0x0  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0  ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x0  ,0x55 ,0x56 ,0x3  ,0x59 ,0xc  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0}; //071123unsigned char ECCTable[]{0x0  ,0x55 ,0x56 ,0x3  ,0x59 ,0xc  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0  ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x0  ,0x55 ,0x56 ,0x3  ,0x59 ,0xc  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0}; //计算ECC代码void NandTranResult(unsigned char reg2,unsigned char reg3,unsigned char *ECCCode){ unsigned char temp1,temp2,i,a,b; temp1temp20; ab0x80; for(i0;i4;i) {  if(reg3a)   temp1|b;  b1;  if(reg2a)   temp1|b;  b1;  a1; } b0x80; for(i0;i4;i) {  if(reg3a)   temp2|b;  b1;  if(reg2a)   temp2|b;  b1;  a1; }  //将最终的ECC存入数组ECCCode ECCCode[0]temp1;//存放高8bit ECCCode[1]temp2;//存放中间的8bit} void NandCalECC(const unsigned char *dat,unsigned char *ECCCode){ unsigned char reg1,reg2,reg3,temp; int j; reg1reg2reg30; for(j0;j256;j) {  tempECCTable[dat[j]];  reg1^(temp0x3f); if(temp0x40)  {   reg3^(unsigned char)j;   reg2^(~((unsigned char)j));  } } NandTranResult(reg2,reg3,ECCCode); //计算最终的ECC码 //此处为什么要做一个求非的操作呢 //不取非也行对结果没有影响 ECCCode[0]~ECCCode[0]; ECCCode[1]~ECCCode[1];  ECCCode[2](((~reg1)2)|0x03);} /** 参数解释* dat[]:实际读取的数据* ReadECC[]:保存数据时根据原始数据产生的ECC码* CalECC[]:读取数据的同时产生的ECC码*/ int NandCorrectData(unsigned char *dat,unsigned char *ReadECC,unsigned char *CalECC){ unsigned char a,b,c,bit,add,i,d1,d2,d3; //计算 d1ReadECC[0]^CalECC[0]; d2ReadECC[1]^CalECC[1]; d3ReadECC[2]^CalECC[2]; //printf(d10x%0x,d20x%0x,d30x%0x/n,d1,d2,d3); if((d1|d2|d3) 0) {  //无错误发生  printf(无错误发生/n);  return 0; } else {  a((d11)^d1)0x55;  b((d21)^d2)0x55;  c((d31)^d3)0x54; //此处的理论依据是如果发生了1bit的ECC错误那么ECC异或地结果是--每个配对的bit数据相反即为01或者10  if((a 0x55)(b 0x55)(c 0x54))  {   //可校正的1bit ECC错误      //首先计算错误的Byte      abc0x80;   add0; for(i0;i4;i)   {    if(d1a)     add|b;    a2;    b1;   }      for(i0;i4;i)   {    if(d2c)     add|b;    c2;    b1;   }      //计算发生错误的Bit   bit0;   a0x80;   b0x04;     // printf(d3 0x%0x/n,d3); for(i0;i3;i)   {    if(d3a)    {     bit|b;  //   printf(Detected!/n);    }    else    {     //printf(d30x%0x,a0x%0x,d3a0x%0x/n,d3,a,d3a);  //   printf(Not Detected!/n);    }    a2;    b1;   } //进行数据纠正  // printf(开始进行数据纠正/n);  // printf(Error byte: %2d,Error bit: %2d/n,add,bit);   b0x01;   bbit;   adat[add];   a^b;   dat[add]a;   return 1;  }  else  {   i0;  // printf(计算异或结果d1,d2,d3中1的个数/n);   //计算异或结果d1,d2,d3中1的个数   while(d1)   {    if(d10x01)     i;    d11;   }   while(d2)   {    if(d20x01)     i;    d31;   }   while(d3)   {    if(d30x01)     i;    d31;   } if(i 1)   {    //发生了ECC错误即存放ECC数据的区域发生了错误正常的情况下无论多少    //bit发生了反转都不会出现i1的情况出现了这种情况的原因只可能是ECC代码本身有问题   // printf(存放ECC数据的区域发生了错误/n);    return 2;   }   else   {    //不可校正的ECC错误即Uncorrectable Error   // printf(Uncorrectable Error/n);    return -1;   } } } return -1;} int main(int argc, char* argv[]){ int temp,i,j,k,l,m0; unsigned char ReadECC[3]{0,0,0},CalECC[3]{0,0,0}; NandCalECC(dat,CalECC); for(i0;i256;i) {  j0x80;  ldat[i];  for(k0;k8;k)  {   m; dat[i]^j; j1; NandCalECC(dat,ReadECC);  tempNandCorrectData(dat,ReadECC,CalECC); if(temp 1) {  if(dat[i]l)   printf(Success/n);     else   printf(Failed/n); // printf(可以校正的错误/n); // printf(dat[0]0x%0x/n,dat[0]); } else if(temp -1) {  //printf(不可以校正的错误); } else if(temp 0) {  //printf(无错误); } else { // printf(数据区发生了错误); }  //   /* dat[5]0x02; NandCalECC(dat,ReadECC);  tempNandCorrectData(dat,ReadECC,CalECC); if(temp 1) {  printf(可以校正的错误/n);  printf(dat[0]0x%0x/n,dat[0]); } else if(temp -1) {  printf(不可以校正的错误); } else if(temp 0) {  printf(无错误); } else {  printf(数据区发生了错误); }*/ //  } } printf(rotate times:%5d/n,m); return 0;} 附件2:512字节ECC校正1比特错误的代码实现  // 512ByteECC071127.cpp : Defines the entry point for the console application.// #include stdafx.h#include stdio.h// 256ByteECC071123.cpp : Defines the entry point for the console application.// //071127unsigned char dat[]{0x0  ,0x0 ,0x0 ,0x0  ,0x0 ,0x0  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0  ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x0  ,0x55 ,0x56 ,0x3  ,0x59 ,0xc  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0  ,0x0  ,0x0 ,0x0 ,0x0  ,0x0 ,0x0  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0  ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x0  ,0x55 ,0x56 ,0x3  ,0x59 ,0xc  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0}; //071123unsigned char ECCTable[]{0x0  ,0x55 ,0x56 ,0x3  ,0x59 ,0xc  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0  ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0x6a ,0x3f ,0x3c ,0x69 ,0x33 ,0x66 ,0x65 ,0x30 ,0x30 ,0x65 ,0x66 ,0x33 ,0x69 ,0x3c ,0x3f ,0x6a ,0xf  ,0x5a ,0x59 ,0xc  ,0x56 ,0x3  ,0x0  ,0x55 ,0x55 ,0x0  ,0x3  ,0x56 ,0xc  ,0x59 ,0x5a ,0xf  ,0xc  ,0x59 ,0x5a ,0xf  ,0x55 ,0x0  ,0x3  ,0x56 ,0x56 ,0x3  ,0x0  ,0x55 ,0xf  ,0x5a ,0x59 ,0xc  ,0x69 ,0x3c ,0x3f ,0x6a ,0x30 ,0x65 ,0x66 ,0x33 ,0x33 ,0x66 ,0x65 ,0x30 ,0x6a ,0x3f ,0x3c ,0x69 ,0x3  ,0x56 ,0x55 ,0x0  ,0x5a ,0xf  ,0xc  ,0x59 ,0x59 ,0xc  ,0xf  ,0x5a ,0x0  ,0x55 ,0x56 ,0x3  ,0x66 ,0x33 ,0x30 ,0x65 ,0x3f ,0x6a ,0x69 ,0x3c ,0x3c ,0x69 ,0x6a ,0x3f ,0x65 ,0x30 ,0x33 ,0x66 ,0x65 ,0x30 ,0x33 ,0x66 ,0x3c ,0x69 ,0x6a ,0x3f ,0x3f ,0x6a ,0x69 ,0x3c ,0x66 ,0x33 ,0x30 ,0x65 ,0x0  ,0x55 ,0x56 ,0x3  ,0x59 ,0xc  ,0xf  ,0x5a ,0x5a ,0xf  ,0xc  ,0x59 ,0x3  ,0x56 ,0x55 ,0x0}; //计算ECC代码void NandTranResult(unsigned int *reg1,unsigned int *reg2,unsigned int *reg3){ unsigned char i,a,b; unsigned int temp1,temp2,temp3; temp1temp2temp30; ab0x80; for(i0;i4;i) {  if((*reg3)a)   temp1|b;  b1;  if((*reg2)a)   temp1|b;  b1;  a1; } b0x80; for(i0;i4;i) {  if((*reg3)a)   temp2|b;  b1;  if((*reg2)a)   temp2|b;  b1;  a1; } temp3|((*reg1)0x3f); temp32; if((*reg3)0x100)  temp3|0x2; if((*reg2)0x100)  temp3|0x1; *reg1temp1; *reg2temp2; *reg3temp3;} void NandCalECC(const unsigned char *dat,unsigned char *ECCCode){ unsigned int reg1,reg2,reg3,temp; unsigned int j; reg1reg2reg30; for(j0;j512;j) {  tempECCTable[dat[j]];  reg1^(temp0x3f); if(temp0x40)  {       reg3^(j0x1ff);   //取出变量j低9个bit的数据   reg2^(~(j0x1ff));//同样的道理取出9的bit数据  // if(j0||j256)  //  printf([NandCalECC] Byte:%3d,reg3:0x%0x,reg2:0x%0x/n,j,reg3,reg2);  } } //printf([NandCalECC] reg10x%0x,reg20x%0x,reg30x%0x/n,reg1,reg2,reg3); NandTranResult(reg1,reg2,reg3); // printf([NandCalECC] reg10x%0x,reg20x%0x,reg30x%0x/n,reg1,reg2,reg3); ECCCode[0]~((unsigned char)reg1); ECCCode[1]~((unsigned char)reg2);  ECCCode[2]~((unsigned char)reg3);  //计算最终的ECC码 //此处为什么要做一个求非的操作呢,如果不做非操作也没有问题 /* ECCCode[0]~ECCCode[0]; ECCCode[1]~ECCCode[1];  ECCCode[2](((~reg1)2)|0x03); */ /* ECCCode[0]ECCCode[0]; ECCCode[1]ECCCode[1];  ECCCode[2](((reg1)2)|0x03); */} /** 参数解释* dat[]:实际读取的数据* ReadECC[]:保存数据时根据原始数据产生的ECC码* CalECC[]:读取数据的同时产生的ECC码*/ int NandCorrectData(unsigned char *dat,unsigned char *ReadECC,unsigned char *CalECC){ unsigned char bit,i; unsigned int add,a,b,c,d1,d2,d3; addabcd1d3d20; //计算 d1ReadECC[0]^CalECC[0]; d2ReadECC[1]^CalECC[1]; d3ReadECC[2]^CalECC[2]; //printf([NandCorrectData] d10x%0x,d20x%0x,d30x%0x/n,d1,d2,d3); if((d1|d2|d3) 0) {  //无错误发生  printf(无错误发生/n);  return 0; } else {  a((d11)^d1)0x55;  b((d21)^d2)0x55;  //c((d31)^d3)0x54;  c((d31)^d3)0x55; //此处的理论依据是如果发生了1bit的ECC错误那么ECC异或地结果是--每个配对的bit数据相反即为01或者10  if((a 0x55)(b 0x55)(c 0x55))  {   //可校正的1bit ECC错误      //首先计算错误的Byte      abc0x80;   add0; for(i0;i4;i)   {    if(d1a)     add|b;    a2;    b1;   }      for(i0;i4;i)   {    if(d2c)     add|b;    c2;    b1;   }      //检查P2048对应位置的值   if(d30x2)   {    add|0x100;   // printf([NandCorrectData] add|0x100/n);   } //计算发生错误的Bit   bit0;   a0x80;   b0x04;     // printf(d3 0x%0x/n,d3); for(i0;i3;i)   {    if(d3a)    {     bit|b;  //   printf(Detected!/n);    }    else    {     //printf(d30x%0x,a0x%0x,d3a0x%0x/n,d3,a,d3a);  //   printf(Not Detected!/n);    }    a2;    b1;   } //进行数据纠正   //printf(开始进行数据纠正/n);   //printf([NandCorrectData] Error byte: %5d,Error bit: %5d/n,add,bit);   b0x01;   bbit;   adat[add];   a^b;   dat[add]a;   return 1;  }  else  {   i0;   //printf(计算异或结果d1,d2,d3中1的个数/n);   //计算异或结果d1,d2,d3中1的个数   while(d1)   {    if(d10x01)     i;    d11;   }   while(d2)   {    if(d20x01)     i;    d31;   }   while(d3)   {    if(d30x01)     i;    d31;   } if(i 1)   {    //发生了ECC错误即存放ECC数据的区域发生了错误正常的情况下无论多少    //bit发生了反转都不会出现i1的情况出现了这种情况的原因只可能是ECC代码本身有问题    //printf(存放ECC数据的区域发生了错误/n);    return 2;   }   else   {    //不可校正的ECC错误多于1比特的错误即Uncorrectable Error    //printf(Uncorrectable Error/n);    return -1;   } } } return -1;} int main(int argc, char* argv[]){ int temp,i,j,k,l,m0,n0; unsigned char ReadECC[3]{0,0,0},CalECC[3]{0,0,0}; printf(*****************Program start******************/n); NandCalECC(dat,CalECC); printf(/n/n); for(i0;i512;i) {  j0x80; ldat[i];//记录下人为修改之前的数据    for(k0;k8;k)  {   //m;//记录该循环执行的次数 dat[i]^j;//改变原始数据的某一个Bit j1;  //为改变原始数据的下一个Bit做准备 NandCalECC(dat,ReadECC);//计算修改过512字节数据的ECC值    tempNandCorrectData(dat,ReadECC,CalECC);//对数据进行ECC if(temp 1)   {    if(dat[i]l)    // printf(Success/n);        n;    else    {     m;     printf(Failed at byte:%5d,bit:%5d/n,i,k);    }    // printf(可以校正的错误/n);    // printf(dat[0]0x%0x/n,dat[0]);   }   else if(temp -1)   {    //printf(不可以校正的错误);   }   else if(temp 0)   {    //printf(无错误);   }   else   {   // printf(数据区发生了错误);   }   //printf(/n/n);  } } printf(Success times:%5d,failed times:%5d/n,n,m); printf(*******************Program end******************/n); return 0;} - -20071127晚 /*************************************************************************************************************//*********************************************** 如有疑问欢迎联系guopeixin126.com***********************************************/ /*************************************************************************************************************/
http://www.yutouwan.com/news/180284/

相关文章:

  • 企业标准网站模板莱芜
  • 网站规范化建设微信分享网站短链接怎么做的
  • 淘宝店铺网站建设周期购那个网站做的比较好
  • 关于网站设计的价格施工企业总工程师述职报告
  • tk网站的dns修改网站开发教程H5
  • 网站哪家公司做的最好国外搜索关键词的网站
  • 南京网站建设推广洛可可成都设计公司
  • 企业门户网站管理制度黄冈论坛东部社区
  • 网站代理备案步骤wordpress内容分享微信
  • 湛江做网站哪家好手机软件app开发
  • 有没有哪个做美食的网站wordpress xml文件
  • 小企业网站建设方案建设网站元素搜索引擎
  • 国内外网站办公电脑租赁平台
  • 北海购物网站开发设计广州正规网站制作公司
  • 网站建设论文ppt蚌埠做网站有哪些公司
  • 南京快速建设企业网站通化市建设工程招投标网站
  • 网站制作需要网站制作第三方做网站
  • 在线网站建设平台wordpress多用户博客系统
  • 建设银行杭州招聘网站欧美网站设计
  • 石家庄网站维护棋牌软件开发定制软件
  • 现在做一个网站多少钱wordpress下载主题demo
  • 高端制作网站设计深圳罗湖商城网站建设
  • 专门做墓志铭的网站wordpress建站属于前端
  • 毕节网站开发公司电话wordpress前台多张缩略图
  • 潍坊 专业网站建设做网页网站怎么样
  • 网站怎么备案在哪里搜索引擎营销的特点
  • 建设企业网站费用硬件开发工程师是做什么的
  • 自己做的简单网站下载健康成都官微最新消息
  • 域名注册最好的网站北京seo多少钱
  • 雄县网站建设公司网站建设教程搭建芽嘱湖南岚鸿信赖