Luigi Rizzo大神在1997年写了一个基于范德蒙矩阵的FEC的纠错代码,这套代码本身开源并且在多个知名项目被使用。我基于这套fec代码,也做了一份RS纠错的例子。

Rizzo, L., "Effective Erasure Codes for Reliable Computer Communication Protocols",ACM SIGCOMM Computer Communication Review, Vol.27, No.2, pp.24-36,April 1997.
Rizzo, L., "Reed-Solomon FEC codec (C language)",original codec: http://info.iet.unipi.it/~luigi/vdm98/vdm980702.tgz,
improved codec: http://openfec.org/,July 1998.

Luigi Rizzo的代码仅包含fec.h和fec.c两个文件。

写一个包装方法rs.c和rs.h,代码如下:

rs.h的代码:

#ifndef LIB_RS_H_
#define LIB_RS_H_#include "fec.h"// input:
// code, generated by fec_new() function from fec.h
// data[0....k-1 ], points to original data
// size, data length
//
// output:
// data[k....n-1], points to generated redundant data
//
// info:
// the function will always succeed,except malloc fail.if malloc fail,it will call exit()
void rs_encode(void *code,char *data[],int size); // input:
// data[0.....n-1] points to original data and redundate data,in right order
// if data[i] is missing ,set poniter data[i] to 0 (point it to null)
//
// outout:
// data[0.....k-1] will point to the recovered original data.
//
// info:
// return zero on success
// if the number of no-zero pointers is less than k,the function will fail and return non-zero
//
// advanced info:
// 1. rs_decode wont malloc memory for those zero pointers in data[0.....k-1]. instead it will re-use the memory of other non-zero pointers (and let data[0.....k-1] point to those memory).
// 2. if the input data[0.....n-1] contains x non-zero pointers,after called rs_decode,there will still be exactly x non-zero poninters in data[0.....n-1],just the order may change.
int rs_decode(void *code,char *data[],int size);void rs_encode2(int k,int n,char *data[],int size);int rs_decode2(int k,int n,char *data[],int size);#endif /* LIB_RS_H_ */

rs.c的代码:

#include "rs.h"
#include "stdlib.h"
#include "string.h"
#include "stdio.h"void rs_encode(void *code,char *data[],int size)
{int k=get_k(code);int n=get_n(code);printf("encode k:%d n:%d\n",k,n );for(int i=k;i<n;i++)//generate redundancy data, k is real, n is all, n-k is redundancy.{fec_encode(code, (void **)data, data[i],i, size);}return ;
}int rs_decode(void *code,char *data[],int size)
{int k=get_k(code);int n=get_n(code);printf("decode k:%d n:%d\n",k,n );int index[n];int count=0;for(int i=0;i<n;i++){if(data[i]!=0){index[count++]=i;}}if(count<k)return -1;for(int i=0;i<n;i++){if(i<count)data[i]=data[index[i]];elsedata[i]=0;}return fec_decode(code,(void**)data,index,size);
}static void * (*table)[256]=0;
void* get_code(int k,int n)
{if (table==0){table=(void* (*)[256]) malloc(sizeof(void*)*256*256);if(!table){return table;}memset(table,0,sizeof(void*)*256*256);}if(table[k][n]==0){table[k][n]=fec_new(k,n);}return table[k][n];
}
void rs_encode2(int k,int n,char *data[],int size)
{void* code=get_code(k,n);rs_encode(code,data,size);
}int rs_decode2(int k,int n,char *data[],int size)
{void* code=get_code(k,n);return rs_decode(code,data,size);
}

main函数的例子代码:

#include<stdio.h>
#include "rs.h"int main(int argc, char *argv[])
{int i,j,k;char arr[6][100]={"aaa","bbb","ccc","ddd","eee","fff"};char *data[6];for(i=0;i<6;i++){data[i]=arr[i];}for(i=0;i<6;i++){printf("before rs encode: <%s>\n",data[i]);}
//6 strings protect 5 strings.rs_encode2(5,6,data,3);for(i=0;i<6;i++){printf("after rs encode: <%s>\n",data[i]);}//simulate lost data.data[0]=0; // 0 is NULL.//data[1]=0;//data[2]=0;int ret=rs_decode2(5,6,data,3);for(i=0;i<6;i++){printf("after rs decode: <%s>\n",data[i]);}return 0;
}

在main函数生成了6个字符串,通过rs_encode2将前5个字符串保护起来,第6个字符串用来存冗余数据。

data[0]=0模拟了丢失数据,然后通过rs_decode2来恢复数据。

输出如下:

before rs encode: <aaa>
before rs encode: <bbb>
before rs encode: <ccc>
before rs encode: <ddd>
before rs encode: <eee>
before rs encode: <fff>
encode k:5 n:6
after rs encode: <aaa>
after rs encode: <bbb>
after rs encode: <ccc>
after rs encode: <ddd>
after rs encode: <eee>
after rs encode: <���>
decode k:5 n:6
after rs decode: <aaa>
after rs decode: <bbb>
after rs decode: <ccc>
after rs decode: <ddd>
after rs decode: <eee>
after rs decode: <(null)>

可见aaa,bbb,ccc,ddd,eee得到了恢复,在《我的下载资源》中有完整代码

RS码FEC机制的实现方法(基于Luigi Rizzo的代码)相关推荐

  1. 【FPGA】基于FPGA的RS码模块设计

    RS编码,又称里所码,即Reed-solomon codes,是一种前向纠错的信道编码,对由校正过采样数据所产生的多项式有效.当接收器正确的收到足够的点后,它就可以恢复原来的多项式,即使接收到的多项式 ...

  2. matlab rsdec,MATLAB在RS码实现中的应用

    中图分类号 :TP393. 08 文献标识码 :A 文章编号 :1009 - 2552(2009)09 - 0160 - 03 MATLAB 在 RS 码实现中的应用 张定云 (中国空空导弹研究院第十 ...

  3. ArrayList源码扩容机制分析

    ArrayList源码&扩容机制分析 发上等愿,结中等缘,享下等福 文章目录 ArrayList源码&扩容机制分析 1. ArrayList 简介 1.1. Arraylist 和 V ...

  4. Zimbra的Web客户端国际字体的控制机制及定制方法

    为什么80%的码农都做不了架构师?>>>    前些日子,在论坛中提出了一个"关于开发Zimbra增补程序的设想",有开客提到如何在Zimbra的Web界面中加入 ...

  5. pyqt漂亮gui界面模板_一种基于模板的C代码自动生成方法

    在做C代码项目的时候,我们期望做到代码的高复用,高复用意味着代码的高配置性,即通过简单的配置修改达到复用代码的目的.如果代码高复用,支持灵活的配置,那么完全可以在上边做一个更简单的配置工具,用来修改代 ...

  6. 请注意,我们要谈谈神经网络的注意机制和使用方法

    全文共8099个字,12张图,预计阅读时间20分钟. 神经网络中的注意机制(attention mechanism),也被称为神经注意(neural attention)或注意(attention), ...

  7. Eatting外卖基于瑞吉外卖代码全功能优化含源码

    Eatting外卖基于瑞吉外卖代码全功能优化含源码 文章目录 项目的最终部署 源码地址 github:[源码地址](https://github.com/yangxingyue0623/Eating_ ...

  8. 推荐机制 协同过滤和基于内容推荐的区别

    基于人口统计学的推荐 基于人口统计学的推荐机制(Demographic-based Recommendation)是一种最易于实现的推荐方法,它只是简单的根据系统用户的基本信息发现用户的相关程度,然后 ...

  9. 使用 iview 实现PC端生成推广海报与二维码并下载的功能,基于iview Modal 对话框 与 Carousel 走马灯组件实现

    使用 iview 实现PC端生成推广海报与二维码并下载的功能,基于iview Modal 对话框 与 Carousel 走马灯组件实现 前言:最近在对公司网页进行改版的时候遇到一个问题,需要在PC端实 ...

  10. 更稳定的手势识别方法-基于手部骨架与关键点检测

    导读 本期将介绍并演示基于MediaPipe的手势骨架与特征点提取步骤以及逐步为基础实现手势识别的方法. 介绍 关于MediaPipe以前有相关文章介绍,可以参见以下链接: Google开源手势识别- ...

最新文章

  1. 二叉排序树(二叉搜索树,二叉查找树)
  2. 「十项全能」图神经网络能干嘛?
  3. 51Nod-2149子串水题find
  4. 金九银十,做一个百度喜欢的淘宝客网站
  5. Arrays中sort部分源码阅读
  6. 公共方法-利用for else搜索字典列表-for else
  7. 和Google 微帧 Hulu Hotstar 爱奇艺 火花思维 猿辅导 新浪微博的专家聊聊Codec
  8. currency in SalesPipeline
  9. 战术网络安全检查表 | Symantec Connect
  10. python 判断该地址 文件创建时间2020年10月14日14时25分32秒 文件最后一次访问时间 文件最后一次修改时间
  11. 使用D9的SetFVF无法控制数据字段在内存中的顺序,所有字段的顺序都是固定的。自能选择好用还是不用。...
  12. Python+matplotlib数据可视化设置图例3个精选案例
  13. 安卓相机如何设置对焦模式
  14. 算法:同构字符串205. Isomorphic Strings
  15. js 正则匹配两个字符串中间的字符,一级匹配带有反斜杠的字符串
  16. 百家号不收录限流无推荐阅读为零抄袭的解决方法!
  17. (论文阅读笔记)Semantic-Aware Domain Generalized Segmentation
  18. MacOS上BeyondCompare无限试用的方法
  19. python 利用脚本命令压缩加密文件并删除源文件
  20. 书籍推荐——一本老书,吴军老师《数学之美》

热门文章

  1. 我知我见:ftp共享
  2. android透明背景边框线
  3. C语言的程序是由什么组成
  4. C++大写字母转小写字母
  5. mac 下 Parallels Desktop 克隆虚拟机 product_uuid 相同
  6. 自学python的痛楚,来报团报吧
  7. html姓名签到,方案二-签到搜索界面-姓名.html
  8. ubuntu16.04 禁用Guest用户
  9. 杨洋江疏影封面照合体,《全职》诠释衣品即人品
  10. 多测师肖sir_高级金牌讲师_项目的实战讲解