# Encode Decode Simple¶

This example shows how to encode and decode a block of memory.

The complete example code is shown below.

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 // Copyright Steinwurf ApS 2018. // Distributed under the "STEINWURF EVALUATION LICENSE 1.0". // See accompanying file LICENSE.rst or // http://www.steinwurf.com/licensing #include #include #include #include #include #include #include /// @example encode_decode_simple.c /// /// Simple example showing how to encode and decode a block /// of memory. int main() { // Seed the random number generator to produce different data every time srand(time(NULL)); // Set the number of symbols (i.e. the generation size in RLNC // terminology) and the size of a symbol in bytes uint32_t symbols = 10; uint32_t symbol_size = 100; // Here we select the finite field to use. // Some common choices are: krlnc_binary, krlnc_binary4, krlnc_binary8 int32_t finite_field = krlnc_binary; // First, we create an encoder & decoder factory. // The factories are used to build actual encoders/decoders krlnc_encoder_factory_t encoder_factory = krlnc_new_encoder_factory( finite_field, symbols, symbol_size); krlnc_decoder_factory_t decoder_factory = krlnc_new_decoder_factory( finite_field, symbols, symbol_size); krlnc_encoder_t encoder = krlnc_encoder_factory_build(encoder_factory); krlnc_decoder_t decoder = krlnc_decoder_factory_build(decoder_factory); uint32_t bytes_used; uint32_t payload_size = krlnc_encoder_payload_size(encoder); uint8_t* payload = (uint8_t*) malloc(payload_size); uint32_t block_size = krlnc_encoder_block_size(encoder); uint8_t* data_in = (uint8_t*) malloc(block_size); uint8_t* data_out = (uint8_t*) malloc(block_size); uint32_t i = 0; for (; i < block_size; ++i) data_in[i] = rand() % 256; krlnc_encoder_set_const_symbols(encoder, data_in, block_size); krlnc_decoder_set_mutable_symbols(decoder, data_out, block_size); // Most of the network coding algorithms supports a mode of operation // which is known as systematic coding. This basically means that // initially all symbols are sent once un-coded. The rational behind this // is that if no errors occur during the transmission we will not have // performed any unnecessary coding operations. An encoder will exit the // systematic phase automatically once all symbols have been sent un-coded // once. if (krlnc_encoder_is_systematic_on(encoder)) { printf("Systematic encoding enabled\n"); } else { printf("Systematic encoding disabled\n"); } // If we do not wish to use systematic encoding, but to do full coding // from the beginning we can turn systematic coding off: // // krlnc_encoder_set_systematic_off(encoder); while (!krlnc_decoder_is_complete(decoder)) { // The encoder will use a certain amount of bytes of the payload // buffer. It will never use more than payload_size, but it might // use less. bytes_used = krlnc_encoder_write_payload(encoder, payload); printf("Payload generated by encoder, rank = %d, bytes used = %d\n", krlnc_encoder_rank(encoder), bytes_used); // Pass the generated packet to the decoder krlnc_decoder_read_payload(decoder, payload); printf("Payload processed by decoder, current rank = %d\n", krlnc_decoder_rank(decoder)); } if (memcmp(data_in, data_out, block_size) == 0) { printf("Data decoded correctly\n"); } else { printf("Unexpected failure to decode, please file a bug report :)\n"); } free(data_in); free(data_out); free(payload); krlnc_delete_encoder(encoder); krlnc_delete_decoder(decoder); krlnc_delete_encoder_factory(encoder_factory); krlnc_delete_decoder_factory(decoder_factory); return 0; }