private static final int decode4to3(final byte[] src, final int sOffset,
                                       final byte[] dest, final int dOffset) {
      if (src[sOffset + 2] == EQUALS_SIGN) { // Example: Dk==
         final int outBuff = ((DECODABET[src[sOffset    ]] & 0xFF) << 18)
                           | ((DECODABET[src[sOffset + 1]] & 0xFF) << 12);
         dest[dOffset] = (byte)(outBuff >>> 16);
         return 1;
      }

      if (src[sOffset + 3] == EQUALS_SIGN) { // Example: DkL=
         final int outBuff = ((DECODABET[src[sOffset    ]] & 0xFF) << 18)
                           | ((DECODABET[src[sOffset + 1]] & 0xFF) << 12)
                           | ((DECODABET[src[sOffset + 2]] & 0xFF) <<  6);
         dest[dOffset    ] = (byte)(outBuff >>> 16);
         dest[dOffset + 1] = (byte)(outBuff >>>  8);
         return 2;
      }

      try { // Example: DkLE
         final int outBuff = ((DECODABET[src[sOffset    ]] & 0xFF) << 18)
                           | ((DECODABET[src[sOffset + 1]] & 0xFF) << 12)
                           | ((DECODABET[src[sOffset + 2]] & 0xFF) <<  6)
                           | ((DECODABET[src[sOffset + 3]] & 0xFF)      );
         dest[dOffset    ] = (byte)(outBuff >> 16);
         dest[dOffset + 1] = (byte)(outBuff >>  8);
         dest[dOffset + 2] = (byte) outBuff;
         return 3;
      } catch (Exception x) {
         if (DEBUG && debuglevel > 8) {
            debug(""+src[sOffset  ]+": "+(DECODABET[src[sOffset    ]]));
            debug(""+src[sOffset+1]+": "+(DECODABET[src[sOffset + 1]]));
            debug(""+src[sOffset+2]+": "+(DECODABET[src[sOffset + 2]]));
            debug(""+src[sOffset+3]+": "+(DECODABET[src[sOffset + 3]]));
         }
         return -1;
      }
   }