汉明码编码解码c++
时间: 2023-11-12 11:07:35 浏览: 205
汉明码是一种线性纠错码,可以用于检测和纠正数据传输中的错误。在C++中,可以通过定义一个汉明码类来实现编码和解码。下面是一个简单的汉明码类的示例代码:
```cpp
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;
class HammingCode {
private:
vector<int> data;
vector<int> encoded_data;
vector<int> syndrome;
int get_parity(int pos, int step) {
int parity = 0;
for (int i = pos; i < data.size(); i += step) {
for (int j = 0; j < step && i + j < data.size(); j++) {
parity ^= data[i + j];
}
}
return parity;
}
void encode() {
int n = data.size();
int m = 0;
while ((1 << m) < n + m + 1) {
m++;
}
encoded_data.resize(n + m);
int j = 0;
for (int i = 0; i < n + m; i++) {
if ((i & (i + 1)) == 0) {
encoded_data[i] = 0;
} else {
encoded_data[i] = data[j++];
}
}
for (int i = 0; i < m; i++) {
int parity = get_parity((1 << i) - 1, (1 << (i + 1)));
encoded_data[(1 << i) - 1] = parity;
}
}
void decode() {
int n = data.size();
int m = 0;
while ((1 << m) < n + m + 1) {
m++;
}
syndrome.resize(m);
for (int i = 0; i < m; i++) {
syndrome[i] = get_parity((1 << i) - 1, (1 << (i + 1)));
}
int error_pos = 0;
for (int i = 0; i < m; i++) {
error_pos |= syndrome[i] << i;
}
if (error_pos > 0) {
encoded_data[error_pos - 1] ^= 1;
}
data.resize(n);
int j = 0;
for (int i = 0; i < n + m; i++) {
if ((i & (i + 1)) != 0) {
data[j++] = encoded_data[i];
}
}
}
public:
HammingCode() {}
void set_data(const vector<int>& data) {
this->data = data;
}
void encode_data() {
encode();
}
void decode_data() {
decode();
}
vector<int> get_encoded_data() const {
return encoded_data;
}
vector<int> get_decoded_data() const {
return data;
}
};
int main() {
vector<int> data = {1, 0, 1, 1};
HammingCode hamming_code;
hamming_code.set_data(data);
hamming_code.encode_data();
vector<int> encoded_data = hamming_code.get_encoded_data();
cout << "Encoded data: ";
for (int i = 0; i < encoded_data.size(); i++) {
cout << encoded_data[i];
}
cout << endl;
encoded_data[2] ^= 1;
hamming_code.set_data(encoded_data);
hamming_code.decode_data();
vector<int> decoded_data = hamming_code.get_decoded_data();
cout << "Decoded data: ";
for (int i = 0; i < decoded_data.size(); i++) {
cout << decoded_data[i];
}
cout << endl;
return 0;
}
```
该示例代码实现了一个简单的汉明码类,可以对数据进行编码和解码。在主函数中,首先定义了一个包含4个数据位的数据向量,然后创建了一个汉明码对象,并将数据向量设置为该对象的数据。接下来,调用了该对象的encode_data方法对数据进行编码,并获取了编码后的数据向量。然后,将编码后的数据向量的第3个位翻转,模拟了一个错误的数据传输。接着,将编码后的数据向量设置为汉明码对象的数据,并调用了该对象的decode_data方法对数据进行解码。最后,获取了解码后的数据向量,并输出到控制台上。
阅读全文