제가 짠 해밍 코드인데염. 4비트 데이터를 7비트에 넣고 Encode를 하고염.
하나의 손실된 비트는 입력 받아염, 몇번째 데이터가 손실 되었는지...
손실된 비트는 0이 되고염. Decode에서 손실된 데이터를 복구하죠.
Check[12] = {6,4,2,0,5,4,1,0,3,2,1,0}; 이 부분 알고리즘으로 돌려야 하는데..
그냥 귀찮아서 초기화를 해버린.. ㅡㅡ;
#include < stdio.h >
#define M_BYTESWAP(i) ((i|1<<4) | (i|0<<2) | (i|1<<1) | (i|1))
#define M_PARITY_OR(Data, Pos) Data | 1 << Pos
#define M_PARITY_AND(Data, Pos) Data & 1 << Pos
#define M_COMPL(Data) 7-Data
int Encode(const char *Encode_bit, char *Encode_Data);
int Decode(const char *Encode_Data, char *Decode_Data);
int Check[12] = {6,4,2,0,5,4,1,0,3,2,1,0};
void main()
{
char Information_bit = {0};
char Encode_Data;
char Decode_Data;
int Errer;
Information_bit = M_BYTESWAP(Information_bit);
Encode(&Information_bit, &Encode_Data);
printf("\nEncode_Data = %x\n", Encode_Data);
printf("Received Errer Bit : ");
scanf("%d",&Errer);
Errer = M_COMPL(Errer);
Encode_Data ^= M_PARITY_AND(Encode_Data,Errer);
printf("Encode_Data = %x\n", Encode_Data);
Decode(&Encode_Data, &Decode_Data);
printf("\nDecode_Data = %x\n", Decode_Data);
}
int Encode(const char *Encode_bit, char *Encode_Data)
{
int count;
int Position;
int i;
*Encode_Data = *Encode_bit;
for (count=0, i=0; i < 12; i++) {
if (0 != (*Encode_Data & 1 << Check[i]))
count++;
else
Position = Check[i];
if ((i+1) % 4 == 0 && i != 0) {
if (count%2 != 0)
*Encode_Data = M_PARITY_OR(*Encode_Data,Position);
/* Check */printf("Encode = %x\tcount = %d\tpos = %d\n", *Encode_Data ,count,Position);
count=0;
}
}
return 0;
}
int Decode(const char *Encode_Data, char *Decode_Data)
{
int count;
int Position;
int Syndrome;
int i;
*Decode_Data = *Encode_Data;
printf("d = %x\n",*Decode_Data);
for (i=0, count=0, Position = 0, Syndrome=0; i < 12; i++ )
{
if (0 != (*Decode_Data & 1 << Check[i]))
count++;
if ((i+1) % 4 == 0 && i != 0) {
if (count % 2 != 0) {
Position = M_PARITY_OR(Position, Syndrome);
/* Check */printf("Decode = %x\tcount = %d\tpos = %d\n", *Decode_Data ,count,Position);
}
Syndrome++;
count=0;
}
}
Position = M_COMPL(Position);
if (Position != 7)
*Decode_Data = M_PARITY_OR(*Decode_Data, Position);
return 0;
}