An Implementation
Listing 1 is short program that test encoding of all possible numbers expressible in 31 bits. The block length is 8 items, each item is 4 bits, and there is one reserved code. The procedures encode() and decode() are compact, yet should provide some flexibility, and a starting point for your application. For more on the encode() and decode() procedures, see the source code available here.
// tst_all_nibbles.c #include <stdint.h> #include <assert.h> #include <stdio.h> #include "linked_encode_decode.h" /* A simple test program that goes through all possible permutations of a 31 bit integer. Encodes into nibbles where each nibble must be different from 0. Decodes and compares */ int main( void ) { uint32_t i = 0; uint32_t j; uint32_t arr[8]; uint32_t original[8]; uint32_t result; do { for ( j = 0; j < 8; j++ ) { arr[j] = (i >> (j*4)) & 0xF; original[j] = arr[j]; } encode( 8, arr ); for ( j = 0; j < 8; j++ ) assert( arr[j] != 0 ); decode( arr ); result = 0; for ( j = 0; j < 8; j++ ) result |= (arr[j] << (j*4)); assert( result == i ); i -= 2; // i is an uint32_t if ( (i & 0xFFFFFF) == 0 ) fprintf( stderr,"." ); } while ( i != 0 ); return 0; }