模拟数据链路层海明码检错

数据链路层具有纠错检错功能以保障可靠服务。
下面进行模拟海明码。

1.内部变量
int len;//用于表明需要添加纠错码的位数
vector<int>TranslateDate;//用户保存海明+数据
vector<int>HeCode;//保存添加的几位海明码
2.获取k的位数

由公式 2 k > = n + k + 1 2^k>=n+k+1 2k>=n+k+1,需要计算出需要补充多少位。使用for循环遍历找到k的最小值

int getLenth(int n) {
		len = 0;
		for (; pow(2, len) < n + len + 1; ++len);
		HeCode.resize(len);
		return len+n;
	}
3.数据转化海明码

线根据下标值来确认是填充原始数据还是海明码补充码。
position变量用于记录当前需要填充的数据的下标【原始数据二进制在原始数据的位置】
flag变量用于判断是不是海明码填充位置【不是就返回true】
cur变量用于记录是第几个填充的海明码

void input(string &str) {
		int position = str.size() - 1;
		//填充数据码
		for (int i = TranslateDate.size() - 1; i >= 1; --i) {
			//不是海明码位置,正常填充
			if (flag(func(i))) {
				TranslateDate[i] = str[position--]-'0';
			}
		}
		//用于记录间隔
		int cur = 1;
		
		while ((position=(TranslateDate.size() - cur)) >= 1) {
			int temp = 0;
			for (int i = position-1; i >= 1; --i) {
				int a = func(position);
				int b = func(i);
				if (flag2(a,b)) {
					temp = temp ^ TranslateDate[i];
				}
			}
			TranslateDate[position] = temp;//填充海明码补充码
			cur *= 2;//下一个海明码填充码位置
		}
	}
4.模拟传输过程中出错

数据在传输后出现差错,模拟后再用海明码检测

void inputError() {
		string str;
		cout << "请输入错误的数据+海明码:";
		cin >> str;
		for (int i = 0; i < str.length(); ++i) {
			TranslateDate[i + 1] = str[i]-'0';
		}
		int position;
		int cur = 1;
		int index = HeCode.size() - 1;
		while ((position = (TranslateDate.size() - cur)) >= 1) {
			int temp = TranslateDate[position];
			for (int i = position - 1; i >= 1; --i) {
				int a = func(position);
				int b = func(i);
				if (flag2(a, b)) {
					temp = temp ^ TranslateDate[i];
				}
			}
			HeCode[index--] = temp;
			cur *= 2;
		}
		print0();
	}
全部代码:
#include<iostream>
#include<vector>
using namespace std;

class HemmingCodeSimulator {
private:
	//添加位长度
	int len;
	//转换后的数据
	vector<int>TranslateDate;
	vector<int>HeCode;
public:
	//判断下标是不是海明码位置
	bool flag(int n) {
		return (n & (n - 1));
	}
	//获取最终海明码长度
	int getLenth(int n) {
		len = 0;
		for (; pow(2, len) < n + len + 1; ++len);
		HeCode.resize(len);
		return len+n;
	}
	//构造函数,用于初始化海明码
	HemmingCodeSimulator() {
		string str;
		cout << "请输入原始数据:";
		cin >> str;
		TranslateDate.resize(getLenth(str.length()) + 1);//第0位不用
		input(str);//数据转海明码+数据
		print();
	}
	//转换海明码
	void input(string &str) {
		int position = str.size() - 1;
		for (int i = TranslateDate.size() - 1; i >= 1; --i) {
			//不是海明码位置,正常填充
			if (flag(func(i))) {
				TranslateDate[i] = str[position--]-'0';
			}
		}
		int cur = 1;
		while ((position=(TranslateDate.size() - cur)) >= 1) {
			int temp = 0;
			for (int i = position-1; i >= 1; --i) {
				int a = func(position);
				int b = func(i);
				if (flag2(a,b)) {
					temp = temp ^ TranslateDate[i];
				}
			}
			TranslateDate[position] = temp;
			cur *= 2;
		}
	}
	//判断是否归编码管理【a海明码下标,b数据下标】
	bool flag2(int a,int b) {
		return a & b;
	}
	//下标转换成位置
	int func(int i) {
		return TranslateDate.size() - i;
	}
	//输出海明码
	void print() {
		cout<<"得到传输数据为:";
		for (int i = 1; i < TranslateDate.size(); ++i) {
			cout << TranslateDate[i];
		}cout << endl;
	}
	//=====================================
	void inputError() {
		string str;
		cout << "请输入错误的数据+海明码:";
		cin >> str;
		for (int i = 0; i < str.length(); ++i) {
			TranslateDate[i + 1] = str[i]-'0';
		}
		int position;
		int cur = 1;
		int index = HeCode.size() - 1;
		while ((position = (TranslateDate.size() - cur)) >= 1) {
			int temp = TranslateDate[position];
			for (int i = position - 1; i >= 1; --i) {
				int a = func(position);
				int b = func(i);
				if (flag2(a, b)) {
					temp = temp ^ TranslateDate[i];
				}
			}
			HeCode[index--] = temp;
			cur *= 2;
		}
		print0();
	}
	void print0() {
		for (auto it : HeCode) {
			cout << it;
		}
	}
};

int main() {
	HemmingCodeSimulator he;
	he.inputError();
}

下面是来自王道书的例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mystic Musings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值