📜  Hamming代码在C C++中的实现(1)

📅  最后修改于: 2023-12-03 14:41:41.321000             🧑  作者: Mango

Hamming代码在C/C++中的实现

简介

Hamming代码是一种用于在数字通信中检测并纠正错误的编码方案。在传输数据时,若数据发生了变化,接收方会通过Hamming代码来检测出错误,如果可以纠正错误,则数据会自动恢复成正确的形式。

原理

Hamming代码采用了汉明距离的概念,即两个二进制序列的不同位数目。Hamming代码是基于格雷码的,也就是读码距离为1。在Hamming代码中,每个编码字包含一个数据位和多个校验位。校验位会检查一组固定的数据位,如果检查出错误,校验位会被设为1。

举个例子,假设我们向第一个数据位加入了一个错误,那么校验位的计算结果将是和它关联的校验位的异或值,这样接收方就可以确定哪个位是错误的,并且可以将其恢复回来。

实现
C语言实现

下面是一个简单的Hamming编码和解码的C语言实现:

#include <stdio.h>
#include <stdlib.h>

#define BITNO 4

// 下面的代码实现了将一个整数转换为一个二进制序列。生成一个长度为n的序列

int* tobinary(int x, int n) {
    int* array = (int*) calloc(n, sizeof(int));
    for (int i = n - 1; i >= 0; i--) {
        array[i] = x % 2;
        x /= 2;
    }
    return array;
}

// 下面的代码实现了将一个二进制序列转换为一个整数

int todecimal(int* array, int n) {
    int sum = 0;
    for (int i = n - 1; i >= 0; i--) {
        sum += array[i] * (1 << (n - i - 1));
    }
    return sum;
}

// 下面的代码实现了将一个包含4位数据的二进制序列扩充为包含7位数据的二进制序列,其中前3位为校验位

int* encode(int* array) {
    int* result = (int*) calloc(7, sizeof(int));
    result[0] = array[0] ^ array[1] ^ array[3];
    result[1] = array[0] ^ array[2] ^ array[3];
    result[2] = array[0];
    result[3] = array[1] ^ array[2] ^ array[3];
    result[4] = array[1];
    result[5] = array[2];
    result[6] = array[3];
    return result;
}

// 下面的代码实现了将一个包含7位数据的二进制序列从错误中恢复

int* correct(int* array) {
    int* result = (int*) calloc(7, sizeof(int));
    result[0] = array[0] ^ array[1] ^ array[3] ^ array[4] ^ array[6];
    result[1] = array[0] ^ array[2] ^ array[3] ^ array[5] ^ array[6];
    result[2] = array[0] ^ array[2] ^ array[4] ^ array[5] ^ array[6];
    result[3] = array[1] ^ array[2] ^ array[3] ^ array[6];
    result[4] = array[1] ^ array[4] ^ array[5] ^ array[6];
    result[5] = array[2] ^ array[4] ^ array[5] ^ array[6];
    result[6] = array[3] ^ array[4] ^ array[5] ^ array[6];
    return result;
}

int main() {
    int original = 7;
    int* binary = tobinary(original, BITNO);
    int* code = encode(binary);
    code[2] = 0; // 引入一个错误
    int* corrected = correct(code);
    int corrected_decimal = todecimal(corrected, 7);
    printf("Original: %d, Corrected: %d\n", original, corrected_decimal);
    return 0;
}
C++语言实现

下面是一个简单的Hamming编码和解码的C++语言实现:

#include <iostream>
#include <vector>

#define BITNO 4

inline std::vector<int> tobinary(int x, int n) {
    std::vector<int> array(n);
    for (int i = n - 1; i >= 0; i--) {
        array[i] = x % 2;
        x /= 2;
    }
    return array;
}

inline int todecimal(std::vector<int>& array) {
    int n = array.size();
    int sum = 0;
    for (int i = n - 1; i >= 0; i--) {
        sum += array[i] * (1 << (n - i - 1));
    }
    return sum;
}

inline std::vector<int> encode(std::vector<int>& array) {
    std::vector<int> result(7);
    result[0] = array[0] ^ array[1] ^ array[3];
    result[1] = array[0] ^ array[2] ^ array[3];
    result[2] = array[0];
    result[3] = array[1] ^ array[2] ^ array[3];
    result[4] = array[1];
    result[5] = array[2];
    result[6] = array[3];
    return result;
}

inline std::vector<int> correct(std::vector<int>& array) {
    std::vector<int> result(7);
    result[0] = array[0] ^ array[1] ^ array[3] ^ array[4] ^ array[6];
    result[1] = array[0] ^ array[2] ^ array[3] ^ array[5] ^ array[6];
    result[2] = array[0] ^ array[2] ^ array[4] ^ array[5] ^ array[6];
    result[3] = array[1] ^ array[2] ^ array[3] ^ array[6];
    result[4] = array[1] ^ array[4] ^ array[5] ^ array[6];
    result[5] = array[2] ^ array[4] ^ array[5] ^ array[6];
    result[6] = array[3] ^ array[4] ^ array[5] ^ array[6];
    return result;
}

int main() {
    int original = 7;
    std::vector<int> binary = tobinary(original, BITNO);
    std::vector<int> code = encode(binary);
    code[2] = 0; // 引入一个错误
    std::vector<int> corrected = correct(code);
    int corrected_decimal = todecimal(corrected);
    std::cout << "Original: " << original << ", Corrected: " << corrected_decimal << std::endl;
    return 0;
}
总结

使用Hamming代码可以很好地检测并纠正数字通信中的错误,其原理是基于汉明距离的概念。本文介绍了如何在C/C++中实现Hamming编码和解码功能。