对1字节数据进行汉明码加密校验,代码不是最优的,且未经完全测试,仅供参考。
#include <stdio.h>
/*
对8bit数据使用汉明码校验
step1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
0 0 0 0 0 0 0 0 x x x x x x x x
step2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 root << 6
0 0 x x x x x x x x 0 0 0 0 0 0
step3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 root << 6
0 0 x x x x x x x x 0 0 0 0 0 0
step4:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 (root & 0010 0000 0000 0000b) | ((root & 0001 1111 1100 0000b) >> 1)
0 0 x 0 x x x x x x x 0 0 0 0 0
step4:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 (root & 1111 1110 0000 0000b) | ((root & 0000 0001 1110 0000b) >> 1)
0 0 x 0 x x x 0 x x x x 0 0 0 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
C1 C2 b8 C4 b7 b6 b5 C8 b4 b3 b2 b1 0 0 0 0
*/
unsigned short hanmingCode(unsigned char src){
unsigned short root;
// unsigned temp = src;
// temp = ((temp >> 4) & 0x0F) | ((temp << 4) & 0xF0);
// temp = ((temp >> 2) & 0x33) | ((temp << 2) & 0xCC);
// temp = ((temp >> 1) & 0x55) | ((temp << 1) & 0xAA);
root = (src << 6);
root = (root & 0x2000) | ((root & 0x1FC0) >> 1);
root = (root & 0xFE00) | ((root & 0x01E0) >> 1);
root = root | ((((root >> 4) + ( root >> 6) + (root >> 9) + (root >> 11)) & 0x0001) << 15); // C1 1357
root = root | ((((root >> 5) + ( root >> 6) + (root >> 10) + (root >> 11)) & 0x0001) << 14); // C2 2367
root = root | ((((root >> 7) + ( root >> 9) + (root >> 10) + (root >> 11)) & 0x0001) << 12); // C4 4567
root = root | ((((root >> 12)) & 0x0001) << 8); // C8 8
return root;
}
int main(){
printf("%x", hanmingCode(0xfe));
return 0;
}