rs.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. int k = get_k(code);
  12. int n = get_n(code);
  13. for (int i = k; i < n; i++) {
  14. fec_encode(code, (void **)data, data[i], i, size);
  15. }
  16. return;
  17. }
  18. int rs_decode(void *code, char *data[], int size) {
  19. int k = get_k(code);
  20. int n = get_n(code);
  21. int index[n];
  22. int count = 0;
  23. for (int i = 0; i < n; i++) {
  24. if (data[i] != 0) {
  25. index[count++] = i;
  26. }
  27. }
  28. if (count < k)
  29. return -1;
  30. for (int i = 0; i < n; i++) {
  31. if (i < count)
  32. data[i] = data[index[i]];
  33. else
  34. data[i] = 0;
  35. }
  36. return fec_decode(code, (void **)data, index, size);
  37. }
  38. static void *(*table)[256] = 0;
  39. void *get_code(int k, int n) {
  40. if (table == 0) {
  41. table = (void *(*)[256])malloc(sizeof(void *) * 256 * 256);
  42. if (!table) {
  43. return table;
  44. }
  45. memset(table, 0, sizeof(void *) * 256 * 256);
  46. }
  47. if (table[k][n] == 0) {
  48. table[k][n] = fec_new(k, n);
  49. }
  50. return table[k][n];
  51. }
  52. void rs_encode2(int k, int n, char *data[], int size) {
  53. void *code = get_code(k, n);
  54. rs_encode(code, data, size);
  55. }
  56. int rs_decode2(int k, int n, char *data[], int size) {
  57. void *code = get_code(k, n);
  58. return rs_decode(code, data, size);
  59. }