需要帮助识别和计算数字表示

时间:2010-06-24 01:58:27

标签: numbers bit-manipulation

我需要帮助确定以下数字格式。

例如,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 个答案:

答案 0 :(得分:1)

我看到这个被称为7bhm(7位有更多)或VLQ(可变长度数量);见http://en.wikipedia.org/wiki/Variable-length_quantity

这是存储大端(最重要的字节优先),而不是Encoding an integer in 7-bit format of C# BinaryReader.ReadString

中描述的C#BinaryReader.Read7BitEncodedInt方法

除了位操作之外,我不知道任何解码方法。

可以在以下位置找到示例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