Python,如何解码二进制编码的十进制(BCD)

时间:2012-07-26 12:09:00

标签: python struct binary decode bcd

二进制字段的描述是:

  

来电号码,用压缩BCD码表示,剩余比特用“0xF”

填充

我尝试使用结构格式'16c'进行打印,然后得到:('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff')如果我使用'16b',我会获得(51, 0, 2, 5, 21, 19, 71, 79, -1, -1, -1, -1, -1, -1, -1, -1)。这是不正确的,我应该得到电话号码,上面的数字是无效的。

print struct.unpack_from('>16b', str(data.read()),offset=46)

上面是无效的代码,我得到的数字无效。我应该用什么格式解压缩16字节字段以及如何转换BCD代码?

3 个答案:

答案 0 :(得分:16)

BCD码每个数字使用4位,通常只编码0到9位数。因此序列中的每个字节包含2个数字,每4位信息1个。

以下方法使用生成器生成这些数字;我假设0xF值意味着没有更多的数字要跟随:

def bcdDigits(chars):
    for char in chars:
        char = ord(char)
        for val in (char >> 4, char & 0xF):
            if val == 0xF:
                return
            yield val

这里我使用right-shift operator将最左边的4位向右移动,使用bitwise AND来选择最右边的4位。

演示:

>>> characters = ('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff')
>>> list(bcdDigits(characters))
[3, 3, 0, 0, 0, 2, 0, 5, 1, 5, 1, 3, 4, 7, 4]

该方法适用于c输出;如果直接传递整数,则可以跳过方法中的ord调用(但改为使用B无符号变量)。或者,您可以直接从文件中读取这16个字节,并直接将此函数应用于这些字节而不使用struct。

答案 1 :(得分:0)

Python 3.x内置了字节对象。

>>> c = b'3\x00\x02\x05\x15\x13GO\xff\xff\xff\xff\xff\xff\xff\xff'
>>> c.hex()
'330002051513474fffffffffffffffff'

然后返回:

>>> c = "9F1A020840"
>>> bytes.fromhex(c)
b'\x9f\x1a\x02\x08@'

答案 2 :(得分:0)

a = b'\x12\x34\x5f'

def comp3_to_int(a):
    b = a.hex()
    c = int(b[0:len(b)-1])
    if b[len(b)-1:] == 'd':
        c = -c
    return c