decode_chunk(char *dest, char *src) { unsigned char c; int i; if (!reverse_init) { for (i = 0; i < 32; i++) { c = base32[i]; reverse32[(int) c] = i; } reverse_init = 1; printf("Initialized reverse b32 array\n"); } c = reverse32[(int) *src++] << 3; // Take bits 11111 from byte 1 c |= (reverse32[(int) *src] & 0x1C) >> 2; // Take bits 11100 from byte 2 *dest++ = c; c = (reverse32[(int) *src++] & 0x3) << 6; // Take bits 00011 from byte 2 c |= reverse32[(int) *src++] << 1; // Take bits 11111 from byte 3 c |= (reverse32[(int) *src] & 0x10) >> 4; // Take bits 10000 from byte 4 *dest++ = c; c = (reverse32[(int) *src++] & 0xF) << 4; // Take bits 01111 from byte 4 c |= (reverse32[(int) *src] & 0x1E) >> 1; // Take bits 11110 from byte 5 *dest++ = c; c = 0; if (reverse32[(int) *src] & 0x1) c = 0x80; // Take bits 00001 from byte 5 src++; c |= reverse32[(int) *src++] << 2; // Take bits 11111 from byte 6 c |= (reverse32[(int) *src] & 0x18) >> 3; // Take bits 11000 from byte 7 *dest++ = c; c = (reverse32[(int) *src++] & 0x7) << 5; // Take bits 00111 from byte 4 c |= reverse32[(int) *src++]; // Take bits 11111 from byte 5 *dest++ = c; }