rs.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * rs.c
  3. *
  4. * Created on: Sep 14, 2017
  5. * Author: root
  6. */
  7. #include "rs.h"
  8. #include "stdlib.h"
  9. #include "string.h"
  10. void rs_encode(void *code,char *data[],int size)
  11. {
  12. int k=get_k(code);
  13. int n=get_n(code);
  14. for(int i=k;i<n;i++)
  15. {
  16. fec_encode(code, (void **)data, data[i],i, size);
  17. }
  18. return ;
  19. }
  20. int rs_decode(void *code,char *data[],int size)
  21. {
  22. int k=get_k(code);
  23. int n=get_n(code);
  24. int index[n];
  25. int count=0;
  26. for(int i=0;i<n;i++)
  27. {
  28. if(data[i]!=0)
  29. {
  30. index[count++]=i;
  31. }
  32. }
  33. if(count<k)
  34. return -1;
  35. for(int i=0;i<n;i++)
  36. {
  37. if(i<count)
  38. data[i]=data[index[i]];
  39. else
  40. data[i]=0;
  41. }
  42. return fec_decode(code,(void**)data,index,size);
  43. }
  44. static void * (*table)[256]=0;
  45. void* get_code(int k,int n)
  46. {
  47. if (table==0)
  48. {
  49. table=(void* (*)[256]) malloc(sizeof(void*)*256*256);
  50. if(!table)
  51. {
  52. return table;
  53. }
  54. memset(table,0,sizeof(void*)*256*256);
  55. }
  56. if(table[k][n]==0)
  57. {
  58. table[k][n]=fec_new(k,n);
  59. }
  60. return table[k][n];
  61. }
  62. void rs_encode2(int k,int n,char *data[],int size)
  63. {
  64. void* code=get_code(k,n);
  65. rs_encode(code,data,size);
  66. }
  67. int rs_decode2(int k,int n,char *data[],int size)
  68. {
  69. void* code=get_code(k,n);
  70. return rs_decode(code,data,size);
  71. }