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

2024-06-10 06:10:36 发布

您现在位置:Python中文网/ 问答频道 /正文

二进制字段的说明如下:

Caller number, expressed with compressed BCD code, and the surplus bits are filled with “0xF”

我试着用struct格式'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代码?


Tags: andthe代码number格式with二进制code
2条回答

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

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@'

相关问题 更多 >