Files
CPP_Core/example/feclib/fectest.c
T
2026-06-16 10:56:40 +08:00

59 lines
1.6 KiB
C

#include <stdlib.h>
#include "../../Core/kcp/feclib/fec.h"
void PayloadCheck (void *dummy, __int64_t pos, fecPayload *b, int len)
{
if ((int) pos != b[0]) fprintf (stderr, "*** Bug in FEC code ! ***\n");
}
static int c = 0;
enum { n = 5000, k = n } dummy;
size_t ChannelSimulate (void *buf, size_t size, size_t count, void *d)
{
if (rand () < RAND_MAX / 3) return 0;
return FecDecode (buf, size, count, (fecDecoder*) d);
}
int main (void)
{
#if 1
char *err;
fecPayload msg[4];
fecDecoder *d = NewFecDecoder (NULL, PayloadCheck);
fecEncoder *e = NewFecEncoder (d, ChannelSimulate, &err, sizeof (msg), n,
k, 20, sizeof (msg) / sizeof (msg[0]), 0);
if (!e || !d) {
fprintf (stderr, "%s\n", err);
return 1;
}
for (msg[0] = 0; msg[0] < n * (int) sizeof (msg);
msg[0] += sizeof (msg)) FecEncode (msg, e);
printf ("Starting recovery...\n");
FlushFecDecoder (d);
printf ("Received %d, Corrected %d, Lost %d\n",
d->receivedPackets, d->correctedPackets, d->lostPackets);
#else // This code generates prime "polynomials".
unsigned i, j, divisor, q, m;
for (i = 1; i < 0x20000; i <<= 1) {
for (j = i; j < 2 * i; j++) { // Going to test j for primeness.
for (divisor = 2; divisor < i; divisor++) {
for (q = j, m = i; m > 0; m >>= 1) {
if ((q ^ (m * divisor)) < q &&
(q ^ (m * divisor)) < m * divisor) q ^= m * divisor;
}
if (q == 0) break; // Not prime
}
if (divisor >= i) break; // Prime
}
printf ("0x%x, ", j);
}
#endif
#ifdef WIN32
getchar ();
#endif
return 0;
}