大三上信息论与编码实验——汉明码的编码过程的c++实现

来源:互联网 发布:黎明杀机淘宝刷血点 编辑:程序博客网 时间:2024/05/22 13:31
汉明码是信道编码的一种,详情可百度,一下给出汉明码的一种实现方式:
#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;}

代码写的并不规范,很多地方都写的很蠢,有很多可以优化的地方;

在网上找到过一些利用生成矩阵实现的汉明码编码,但因对其原理并不了解,便用其它方法实现了一个汉明码编码;

下次要实现的是输入一个接收到的汉明码然后对其进行纠错和译码。

0 0