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

汉明码是信道编码的一种,详情可百度,一下给出汉明码的一种实现方式:
#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版权协议,转载请附上原文出处链接和本声明。