集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2258|回复: 9

汉明码的编码和校验的C++实现

[复制链接]
fpga_feixiang 发表于 2020-5-21 11:56:44 | 显示全部楼层 |阅读模式
auto cal(size_t sz)->decltype(auto)
{
    decltype(sz) k = 0;
    decltype(sz) cur = 1;
    while (cur - 1 < sz + k )
    {
        cur <<= 1;
        k++;
    }   
    return k;
}
复制代码
复制代码
bool encode(const string &s, string &d)
{
    d.clear();
    auto k = cal(s.size());
    d.resize(s.size() + k);
    for (decltype(d.size()) i = 0, j = 0, p = 0; i!= d.size();i++)
    {
        if ((i + 1) == pow(2,p) && p < k)
        {
            d[i] = '0';
            p++;
        }
        else if (s[j] == '0' || s[j] == '1')
            d[i] = s[j++];
        else
            return false;
    }
    for (auto i = 0; i != k;i++)
    {
        int count = 0 ,index = 1 << i;
        for (auto j = index - 1; j < d.size() ;j += index)
            for (auto k = 0; k!= index && j < d.size(); k++, j++)
                count ^= d[j] - '0';
        d[index - 1] = '0' + count;
    }
    return true;
}
复制代码

解码与校验:
复制代码
auto antiCal(size_t sz)->decltype(auto)
{
    decltype(sz) k = 0;
    decltype(sz) cur = 1;
    while (cur < sz)
    {
        cur <<= 1;
        k++;
    }   
    return k;
}

auto decode(string &s, string &d)->decltype(auto)
{
    s.clear();
    auto k = antiCal(d.size());
    s.resize(d.size() - k);

    decltype(d.size()) sum = 0;
    for (decltype(k) p = 0;p != k;p++)
    {
        int pAnti = 0;
        decltype(k) index = 1 << p;
        for (decltype(d.size()) i = index - 1;i < d.size(); i+=index)
        {
            for (auto j = 0; j < index && i < d.size(); i++, j++)
                pAnti ^= d[i] - '0';
        }
        sum += pAnti << p;
    }
    if (sum != 0)
        d[sum - 1] = (1- (int)(d[sum - 1] - '0')) + '0';

    for (decltype(d.size()) i = 0, p = 0,j = 0; i != d.size(); i++)
    {
        if ((i + 1) == (1 << p) && p < k)
            p++;
        else
            s[j++] = d[i];
    }

    return sum;
}
复制代码


测试样例:
复制代码
int main()
{
    string source, dest;
    while (cin >> source)
    {
        if (encode(source,dest))
        {
            cout << "Source: " <<source << endl;
            cout << "Dest: " << dest << endl;
        }
        size_t index;
        cout << "----input error index : ";
        cin >> index;
        auto k = dest.size();
        if (index != 0 && index <= dest.size())
            dest[index - 1] = (1 - (int)(dest[index - 1] - '0')) + '0';
        cout << "Code " << dest <<endl;
        auto ret = decode(source,dest);
        if (ret == 0)
        {
            cout << "Source: " <<source << endl;
            cout << "Dest: " <<dest << endl;
        }   
        else
        {
            cout << "Error index "<< ret  << endl;
            cout << "Corret source: " <<source << endl;
            cout << "Corret dest: " <<dest << endl;
        }
        cout << endl;
    }
    return 0;
}

10101
Source: 10101
Dest: 001101011
----input error index : 8
Code 001101001
Error index 8
Corret source: 10101
Corret dest: 001101011


1001010101010101010111111001101
Source: 1001010101010101010111111001101
Dest: 1111001101010100101010101111110101101
----input error index : 20
Code 1111001101010100101110101111110101101
Error index 20
Corret source: 1001010101010101010111111001101
Corret dest: 1111001101010100101010101111110101101


1
Source: 1
Dest: 111
----input error index : 0
Code 111
Source: 1
Dest: 111
大鹏 发表于 2020-5-21 16:32:38 | 显示全部楼层
汉明码的编码和校验的C++实现
zxopenljx 发表于 2020-11-13 22:37:05 | 显示全部楼层
汉明码的编码和校验的C++实现
大鹏 发表于 2020-11-28 13:10:51 | 显示全部楼层
汉明码的编码和校验的C++实现
ferpurplex 发表于 2020-12-3 18:37:30 | 显示全部楼层
大佬666666
zxopenljx 发表于 2022-9-8 09:32:48 | 显示全部楼层
汉明码的编码和校验的C++实现
dameihuaxia 发表于 2022-9-27 14:34:03 | 显示全部楼层
RS编码和纠错算法
http://www.fpgaw.com/forum.php?m ... 3&fromuid=58166
(出处: fpga论坛|fpga设计论坛)
大鹏 发表于 2022-9-28 16:40:28 | 显示全部楼层
汉明码的编码和校验的C++实现
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-1 13:22 , Processed in 0.064037 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表