private int decodeHandle() {
        int index = _index;
        int base = _bytes[index++] & 0xFF;

        int result = base & 0x00000007;
        int v;

        switch (base & TYPE_CODER1) {
        case TYPE_CODER6:
            v = _bytes[index++] & 0xFF;
            if ((v & 0xC0) != 0xC0)
                break;
            result = result << 6 | (v & 0x3F);

            v = _bytes[index++] & 0xFF;
            if ((v & 0xC0) != 0xC0)
                break;
            result = result << 6 | (v & 0x3F);

            v = _bytes[index++] & 0xFF;
            if ((v & 0xC0) != 0xC0)
                break;
            result = result << 6 | (v & 0x3F);

            // Intentionally falls through

        case TYPE_CODER3:
            v = _bytes[index++] & 0xFF;
            if ((v & 0xC0) != 0xC0)
                break;
            result = result << 6 | (v & 0x3F);

            // Intentionally falls through

        case TYPE_CODER2:
            v = _bytes[index++] & 0xFF;
            if ((v & 0x80) != 0x80)
                break;
            result = result << 6 | (v & 0x3F);

            // Intentionally falls through

        case TYPE_CODER1:
            _index = index;
            return result + ClassIndex.HANDLE_BASE;

        default:
        }
        throw new ConversionException("Invalid KeyCoder handle at " + _index);
    }