gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:11:26 25 4
gpt4 key购买 nike

二进制字段的描述是:

Caller number, expressed with compressed BCD code, and the surplus bits are filled with “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 码?

最佳答案

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 个字节,并将此函数直接应用于这些字节,而无需使用结构。

关于Python,如何解码二进制编码的十进制(BCD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11668969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com