在 Python 3.x 中转换 8 位和 7 位值
Posted
技术标签:
【中文标题】在 Python 3.x 中转换 8 位和 7 位值【英文标题】:Converting 8-bit and 7-bit values in Python 3.x 【发布时间】:2020-12-31 03:19:39 【问题描述】:我正在尝试将无符号整数值转换为表示为 4 个 7 位字节的值;目标是使用 Roland 的地址映射 MIDI System Exclusive 协议发送数据,该协议表示地址和大小值,如下所示:
MSB LSB
--------- --------- --------- ---------
0aaa aaaa 0bbb bbbb 0ccc cccc 0ddd dddd
不幸的是,我真的不知道从哪里开始这样做;目标是在 Python 3.x 中做到这一点,我目前正在制作原型。我真正遇到的问题是数学和位操作,但奇怪的是,我什至找不到任何通用算法或经验法则来做到这一点。我找到的最接近的是 this discussion 大约十年前的 Perl 解决方案,但我在破译 Perl 时也遇到了一些麻烦。除此之外,我只看到几个 C++ 问题的答案建议使用位集。
对于一个特定的用法示例,假设我要发送 128 字节的数据。这要求我仅使用每个字节的低 7 位发送一个 4 字节大小的值。但是,这个值通常是 0x00000080,其中 LSB 的高位为 1,需要转换。
对不起,如果这令人困惑,我可能在这里偏离了基地,但谁能指出我正确的方向?我确信以前有人这样做过,因为它似乎会在 MIDI 编程中经常出现。
【问题讨论】:
结帐BitMap for python。它说它提供了一个 BitMap 类,它是一个以紧凑格式存储的位数组。我从未使用过它,但似乎它可能会有所帮助 【参考方案1】:可变长度数量(如链接问题中所示)使用不同的编码。
无论如何,要将一个值拆分为 7 位字节,在每一步中提取最低 7 位,然后将剩余的值右移 7 位,以便下一部分在下一步中处于正确位置:
def encode_as_4x7(value):
result = []
for i in range(4):
result = [value & 0x7f] + result
value >>= 7
return result
【讨论】:
谢谢,这似乎可行——我还没有真正弄清楚数学是如何在我脑海中运作的,但看起来我也可以使用该函数的逆版本(作为手册提供了 4x7 格式的地址),因此我将尝试在此过程中正确理解。再次感谢! 想象一下如何提取 28 个单个位。然后将其扩展到七位组。以上是关于在 Python 3.x 中转换 8 位和 7 位值的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何将 32 位有符号长整数转换为 7 位整数