汉明码是信道编码的一种,详情可百度,一下给出汉明码的一种实现方式:
#include<iostream>
#include<string>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main(){
srand((int)time(0));
string xinxi1;//需要编码的二进制序列
//随机生成一个长度最长为248的二进制序列
//unsigned int xinxi_length = rand() % 248 + 1;
//for (unsigned int i = 0; i < xinxi_length; i++) {
// xinxi.push_back(rand() % 2 + 48);
//}
//cout << "随机生成的二进制序列为" << xinxi << endl;
//手动输入一个二进制序列和这个二进制序列的长度
unsigned int xinxi_length;
cin >> xinxi1 >> xinxi_length;
string xinxi;
for (int i = xinxi1.size() - 1; i >= 0; i--) {
xinxi.push_back(xinxi1[i]);
}
cout << xinxi << endl;
//编码过程
unsigned int a = 128, jiaoyan=7;
for (; xinxi_length + jiaoyan < a; jiaoyan--, a /= 2);
jiaoyan++;
cout << xinxi_length << " " << jiaoyan << endl;
//将信息位存入最后要输出的编码序列
string bianma(xinxi_length+jiaoyan,0);
for (unsigned int i = 1, j = 1, k = 0; j <= xinxi_length + jiaoyan; j++) {
if (j == i) {
i *= 2;
bianma[j - 1] = ' ';
}
else {
bianma[j - 1] = xinxi[k];
k++;
}
}
cout << bianma << endl;
//ch用来存最高为八位的校验位
char ch;
for (unsigned int i = 0; i < xinxi_length + jiaoyan; i++) {
if (bianma[i] == '1') {
ch = i+1;
break;
}
}
for (unsigned int i = ch; i < xinxi_length + jiaoyan; i++) {
if (bianma[i] == '1') {
ch = ch ^ (char)(i+1);
}
}
for (unsigned int i = 0, j = 1; i < jiaoyan; i++) {
if ((ch & 1 << i) != 0) {
bianma[j - 1] = '1';
}
else {
bianma[j - 1] = '0';
}
j *= 2;
}
string bianma1;
for (int i = bianma.size() - 1; i >= 0; i--) {
bianma1.push_back(bianma[i]);
}
cout << bianma1 << endl;
//cout << "输入一个七位汉明码:" << endl;
//string hanming;
//cin >> hanming;
//char b[4];
system("pause");
return 0;
}
代码写的并不规范,很多地方都写的很蠢,有很多可以优化的地方;
在网上找到过一些利用生成矩阵实现的汉明码编码,但因对其原理并不了解,便用其它方法实现了一个汉明码编码;
下次要实现的是输入一个接收到的汉明码然后对其进行纠错和译码。
版权声明:本文为shenqi48原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。