数据链路层具有纠错检错功能以保障可靠服务。
下面进行模拟海明码。
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();
}
下面是来自王道书的例子