# ECC Error-Correcting Code
*Author:Wei-Li NKUST CSIE CVLAB*
###### tags: `漢明碼` `C語言`
## Algorithm

### 編碼過程
從左到右數
輸入一個8bit ==1001 1010==
會變成 ==0111 0010 1010==
轉換過程如下 p1的六個位置的數 1的總和要是偶數 p2 p4 p8以此類推

### 檢查是否有錯
==故意在第10位元把0改成1==

**驗證過程**

回推 可以知道 第10位元是錯的
==**~~若錯兩位元 那回推之後 會超過12位元~~**==
認知有誤 待修正中
**目前已知 漢名碼在兩個錯誤的時候可能會有問題**
:::info
第一個副程式
當我們丟入8Bit原始資料,請幫我們產出校正碼
並回傳出來校正碼+原始資料
:::
```c=
int *Encode(int data[8]){
static int outputdata[12]={0,0,0,0,0,0,0,0,0,0,0,0};
outputdata[2]=data[0];
outputdata[4]=data[1];
outputdata[5]=data[2];
outputdata[6]=data[3];
outputdata[8]=data[4];
outputdata[9]=data[5];
outputdata[10]=data[6];
outputdata[11]=data[7];
//Calculation of even parity XOR
outputdata[0]=outputdata[2]^outputdata[4]^outputdata[6]^outputdata[8]^outputdata[10];
outputdata[1]=outputdata[2]^outputdata[5]^outputdata[6]^outputdata[9]^outputdata[10];
outputdata[3]=outputdata[4]^outputdata[5]^outputdata[6]^outputdata[11];
outputdata[7]=outputdata[8]^outputdata[9]^outputdata[10]^outputdata[11];
return outputdata;
}
```
**採用陣列進 陣列出**
結構是一維陣列 輸入長度為8
==EX: int mydata[8]={1,0,0,1,1,0,1,0};==
:::info
第二個副程式 **(有BUG 2020/06/09)**
當輸入校正碼+8bit原始資料,其中有1碼錯誤時,請用ECC將錯誤碼修正回來
並回兩筆變數資料
第一筆為:修正後資料
第二筆: 無法修復的變數設定為0,並回傳
那萬一有兩碼錯時,ECC無法修復,則無法修復的變數設定為1,並回傳
:::
```c=
struct fixdata{
int *data;
int fix;
};
fixdata ecc(int datacheck[12]){
int p,p0,p1,p3,p7;
fixdata fd;
p0=datacheck[0]^datacheck[2]^datacheck[4]^datacheck[6]^datacheck[8]^datacheck[10];
p1=datacheck[1]^datacheck[2]^datacheck[5]^datacheck[6]^datacheck[9]^datacheck[10];
p3=datacheck[3]^datacheck[4]^datacheck[5]^datacheck[6]^datacheck[11];
p7=datacheck[7]^datacheck[8]^datacheck[9]^datacheck[10]^datacheck[11];
//printf("p7: %d p3: %d p1: %d p0: %d \n",p7,p3,p1,p0);
p=p7*8+p3*4+p1*2+p0;
if(p==0){
fd.data=datacheck;
fd.fix=0;
printf("\nno error !\n\n");
}
else if(p>12){
//error bug
printf("\n have two error cannot fix ! \n");
fd.fix=1;
}
else{
printf("\n錯誤的位元是第 %d 位元 \n",p);
if(datacheck[p-1]==0){
datacheck[p-1]=1;
}else{
datacheck[p-1]=0;
}
fd.data=datacheck;
fd.fix=0;
}
return fd;
}
```
*做了一個結構可以回傳兩個值*
*第一個為修正後*
*第二個是可不可以修正*
**同樣是陣列輸入**
結構是一維陣列 輸入長度為12
==EX: int datacheck[12]={1,1,1,1,0,0,1,0,1,0,1,0};==
## 總覽
```c=
//coding by wei 2020-5-11
//it can work on windows10 x64 dev-c++ or visual studio2017
#include<stdio.h>
#include<iostream>
//第一個副程式
//傳陣列進來這個
// 8bit 幫你轉成 12bit (8+4) 4是校證碼(_) _ _ X _ X X X _ X X X X
int *Encode(int data[8]){
static int outputdata[12]={0,0,0,0,0,0,0,0,0,0,0,0};
outputdata[2]=data[0];
outputdata[4]=data[1];
outputdata[5]=data[2];
outputdata[6]=data[3];
outputdata[8]=data[4];
outputdata[9]=data[5];
outputdata[10]=data[6];
outputdata[11]=data[7];
//Calculation of even parity XOR
outputdata[0]=outputdata[2]^outputdata[4]^outputdata[6]^outputdata[8]^outputdata[10];
outputdata[1]=outputdata[2]^outputdata[5]^outputdata[6]^outputdata[9]^outputdata[10];
outputdata[3]=outputdata[4]^outputdata[5]^outputdata[6]^outputdata[11];
outputdata[7]=outputdata[8]^outputdata[9]^outputdata[10]^outputdata[11];
return outputdata;
}
//自創結構
struct fixdata{
int *data;
int fix;
};
fixdata ecc(int datacheck[12]){
int p,p0,p1,p3,p7;
fixdata fd;
p0=datacheck[0]^datacheck[2]^datacheck[4]^datacheck[6]^datacheck[8]^datacheck[10];
p1=datacheck[1]^datacheck[2]^datacheck[5]^datacheck[6]^datacheck[9]^datacheck[10];
p3=datacheck[3]^datacheck[4]^datacheck[5]^datacheck[6]^datacheck[11];
p7=datacheck[7]^datacheck[8]^datacheck[9]^datacheck[10]^datacheck[11];
//printf("p7: %d p3: %d p1: %d p0: %d \n",p7,p3,p1,p0);
p=p7*8+p3*4+p1*2+p0;
if(p==0){
fd.data=datacheck;
fd.fix=0;
printf("\nno error !\n\n");
}
else if(p>12){
//error bug
printf("\n have two error cannot fix ! \n");
fd.fix=1;
}
else{
printf("\n錯誤的位元是第 %d 位元 \n",p);
if(datacheck[p-1]==0){
datacheck[p-1]=1;
}else{
datacheck[p-1]=0;
}
fd.data=datacheck;
fd.fix=0;
}
return fd;
}
int main(){
int inputdata[8]={1,0,0,1,1,0,1,0}; //輸入
int *data;
data=Encode(inputdata);
for (int i=0;i<12;i++) {
printf("%d",data[i]);
}
printf("\n\n");
printf("輸入校正碼(4bit)+原始資料(8bit) 12bit \n");
//011100101010
int datacheck[12]={0,1,1,1,0,0,1,0,1,0,1,0}; //輸入驗證
for (int i=0;i<12;i++) {
printf("%d",datacheck[i]);
}
printf("\n\n");
fixdata fd; //宣告自創結構
fd=ecc(datacheck);
for (int i=0;i<12;i++) {
printf("%d",fd.data[i]);
}
printf("\n\nfix : %d",fd.fix);
printf("\n\n\n");
system("pause");
return 0;
}
```
::: spoiler 補充
SEC-DED = Single-Error-Correcting and Double-Error-Detecting code
:::
>reference
> [The Hamming Single Error Correction Code (ECC) - 朱宗賢老師](https://www.youtube.com/watch?v=fgHaBP9s7t4&fbclid=IwAR2z-g_GYb975EluYpzxf-RJAfzoxwlXjXngVTJAbn9Ks7M1jstsMjK9PGM)
> [漢明碼](https://zh.wikipedia.org/wiki/%E6%B1%89%E6%98%8E%E7%A0%81)