mirror of
https://github.com/wangyu-/UDPspeeder.git
synced 2025-01-18 13:59:34 +08:00
65 lines
1.4 KiB
C++
65 lines
1.4 KiB
C++
/*
|
|
* rs.c
|
|
*
|
|
* Created on: Sep 14, 2017
|
|
* Author: root
|
|
*/
|
|
#include "rs.h"
|
|
#include "stdlib.h"
|
|
#include "string.h"
|
|
|
|
void rs_encode(void *code, char *data[], int size) {
|
|
int k = get_k(code);
|
|
int n = get_n(code);
|
|
for (int i = k; i < n; i++) {
|
|
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);
|
|
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]];
|
|
else
|
|
data[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);
|
|
}
|