Кодирование числа в бинарный формат

Rin

*
Кодирование числа в бинарный формат

Не хочется делать велосипед, есть ли готовое решение для кодирования/раскодирования числа в бинарный формат по такой схеме:
Код:
2^7  0xxxxxxx
2^14 10xxxxxx xxxxxxxx
2^21 110xxxxx xxxxxxxx xxxxxxxx
2^28 1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx
...
 

fixxxer

К.О.
Партнер клуба
Явно вариация на тему utf-8; соответственно - берется код конвертации ucs* -> uft-8 и переписывается (а точнее упрощается)

Взять можно да хоть бы в spidermonkey том же. (Вариант на php из сишного делается легко, главное, не забывать про signed-ы и зависимость от 32/64bit)
 

phprus

Moderator
Команда форума
Rin
Тогда, я думаю, придется самому вычислять в какой диапазон попадает значение, находить числовое значение каждого его байта (операциями % и целочисленного деления) и упаковывать их при помощь chr.
Хотя, мне кажется, что это можно и с помощью pack сделать, но без проверок в какой диапазон попадает число все-равно не обойтись.
 

baev

‹°°¬•
Команда форума
Какая-то схема странная.

2^14 будет 1000000 00000000
(14 нулей)
Диапазон, по идее, должен заканчиваться 2^15.
 

Rin

*
Нашёл, вытащу отсюда: http://xbup.sourceforge.net/?download

Java:
Код:
    public int fromStreamUB(InputStream stream) throws IOException {
        byte buf[] = new byte[1];
        stream.read(buf);
        int input = (char) buf[0] & 0xFF;
        if (input > 223) {
            value = (input & 0x1F) << 24;
            stream.read(buf);
            value += ((char) buf[0] & 0xFF) << 16;
            stream.read(buf);
            value += ((char) buf[0] & 0xFF) << 8;
            stream.read(buf);
            value += ((char) buf[0] & 0xFF) + 0x204080;
            return 4;
        } else if (input > 191) {
            value = (input & 0x3F) << 16;
            stream.read(buf);
            value += ((char) buf[0] & 0xFF) << 8;
            stream.read(buf);
            value += ((char) buf[0] & 0xFF) + 0x4080;
            return 3;
        } else if (input > 127) {
            value = (input & 0x7F) << 8;
            stream.read(buf);
            value += ((char) buf[0] & 0xFF) + 0x80;
            return 2;
        } else {
            value = buf[0];
            return 1;
        }
    }

    public int toStreamUB(OutputStream stream) throws IOException {
        if (value < 0x80) {
            stream.write((char) value);
            return 1;
        } else if (value < 0x4080) {
            long pom = ((value - 0x80) >> 8) + 128;
            stream.write((char) pom);
            pom = (value - 0x80) & 0xFF;
            stream.write((char) pom);
            return 2;
        } else if (value < 0x204080) {
            long pom = ((value - 0x4080) >> 16) + 192;
            stream.write((char) pom);
            pom = ((value - 0x4080) >> 8) & 0xFF;
            stream.write((char) pom);
            pom = (value - 0x4080) & 0xFF;
            stream.write((char) pom);
            return 3;
        } else if (value < 0x10204080) {
            long pom = ((value - 0x204080) >> 24) + 224;
            stream.write((char) pom);
            pom = ((value - 0x204080) >> 16) & 0xFF;
            stream.write((char) pom);
            pom = ((value - 0x204080) >> 8) & 0xFF;
            stream.write((char) pom);
            pom = (value - 0x204080) & 0xFF;
            stream.write((char) pom);
            return 4;
        } else {
            return 0;
        }
    }

    public int sizeUB() {
        if (value < 0x80) {
            return 1;
        } else if (value < 0x4080) {
            return 2;
        } else if (value < 0x204080) {
            return 3;
        } else if (value < 0x10204080) {
            return 4;
        } else {
            return 5;
        }
    }
-~{}~ 14.08.09 00:15:

baev

2^14 и подобные -- это кол-во вариантов в моём примере
 
Сверху