汉明码校验C代码

对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;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值