static void shuffle(UBytePtr buf, int len) {
        int i;
        int t;

        if (len == 2) {
            return;
        }

        //if (len % 4) exit(1);	/* must not happen */
        len /= 2;

        for (i = 0; i < len / 2; i++) {
            t = buf.read(len / 2 + i);
            buf.write(len / 2 + i, buf.read(len + i));
            buf.write(len + i, t);
        }

        shuffle(buf, len);
        shuffle(new UBytePtr(buf, len), len);
    }