Listing 3 Calculation to encode 9 input bytes into 11 output characters

#define BASE 94        /* # possible output chars */
#define FIRST_CODE '!' /* lowest output char      */
#define PBASE 56       /* prefix base             */
#define BASESQ (unsigned long)(BASE*BASE)
#define MAKE_PRINT(c) (char)((c)+FIRST_CODE)
#define CV2ASCII(p,v) (*(p)=MAKE_PRINT((v)/BASE), \
                   *(p+1)=MAKE_PRINT((v)%BASE))
#define PBMULT (unsigned)(((0xffffffffUL/PBASE)>>16)+1)
...
/* Encode 9 bytes into 11 printable ASCII chars.    */
   unsigned long block; /* conversion area      */
   int         i;       /* input byte index     */
   unsigned int qb = 0; /* prefixes             */
   ldiv_t      ld;      /* quotient, remainder  */

   for (i = 1; i < 9; i += 4) {
      unsigned q;
      block = ((unsigned long)
              (((unsigned)in[i+0]<<8)  in[i+1])<<16)+
             (((unsigned) in[i+2]<<8)  in[i+3]);

      q = (unsigned) (block >> 16) / PBMULT;
      block = block- ((unsigned long)(q*PBMULT) << 16);
      ld = ldiv ((long) block, (long) BASESQ);
      CV2ASCII(out+i+2, (unsigned) ld.quot);
      CV2ASCII(out+i+4, (unsigned) ld.rem);
      qb = qb * PBASE + q;
   }

   /* Now convert the remaining byte and prefixes
   * from previous block conversions                */
   block = ((unsigned long) qb << 8)  in[0];
   ld =ldiv ((long) block, (long) BASESQ);
   out[0] = MAKE_PRINT((unsigned) ld.quot);
   CV2ASCII(out+1, (unsigned) ld.rem);

/* End of File */