【问题标题】:Converting 8-bit and 7-bit values in Python 3.x在 Python 3.x 中转换 8 位和 7 位值
【发布时间】: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 类,它是一个以紧凑格式存储的位数组。我从未使用过它,但似乎它可能会有所帮助

标签: python python-3.x midi


【解决方案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 个单个位。然后将其扩展到七位组。
猜你喜欢
  • 2021-03-24
  • 2021-08-15
  • 1970-01-01
  • 2012-07-17
  • 2012-07-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多