二进制字段的说明如下:
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代码?
BCD码每一个数字有4位,通常只编码0-9位。所以序列中的每个字节包含2个数字,每4位信息中有1个。
以下方法使用生成器生成这些数字;我假设0xF值表示没有更多的数字可遵循:
在这里,我使用right-shift operator将最左边的4位移到右边,使用bitwise AND只选择最右边的4位。
演示:
该方法与
c
输出一起工作;如果直接传递整数(但改用B
无符号变量),则可以跳过该方法中的ord
调用。或者,您可以直接从文件中读取这16个字节,并将此函数直接应用于这些字节,而不使用struct。Python 3.x有这个内置的字节对象。
后面:
相关问题 更多 >
编程相关推荐