Нужна помощь в определении и вычислении числового представления - PullRequest
0 голосов
/ 24 июня 2010

Мне нужна помощь в определении следующего числового формата.

Например, следующий формат чисел в MIB:

0x94 0x78 = 2680
0x94 0x78 in binary: [1001 0100] [0111 1000]

Кажется, что если MSB равен 1, это означает, что за ним следует другой символ. И если это 0, это конец числа.

Таким образом, значение 2680 равно [001 0100] [111 1000], правильно отформатировано: [0000 1010] [0111 1000]

Как называется этот числовой формат и как его можно вычислить, помимо манипулирования битами и перехода к большему целому без знака?

1 Ответ

1 голос
/ 24 июня 2010

Я видел, что это называется 7bhm (7-битный has-more) или VLQ (величина переменной длины); см http://en.wikipedia.org/wiki/Variable-length_quantity

Это хранится с прямым порядком байтов (сначала старший байт), в отличие от метода C # BinaryReader.Read7BitEncodedInt, описанного в Кодирование целого числа в 7-битном формате C # BinaryReader.ReadString

Я не знаю ни одного метода декодирования, кроме манипулирования битами.

Пример кода PHP можно найти по адресу http://php.net/manual/en/function.intval.php#62613

или в Python я бы сделал что-то вроде

def encode_7bhm(i):
    o = [ chr(i & 0x7f) ]
    i /= 128

    while i > 0:
        o.insert(0, chr(0x80 | (i & 0x7f)))
        i /= 128

    return ''.join(o)


def decode_7bhm(s):
    o = 0

    for i in range(len(s)):
        v = ord(s[i])
        o = 128*o + (v & 0x7f)

        if v & 0x80 == 0:
            # found end of encoded value
            break
    else:
        # out of string, and end not found - error!
        raise TypeError

    return o
...