在 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 位值的主要内容,如果未能解决你的问题,请参考以下文章

位和位模式

单片机中高8位是啥,低8位又是啥,还有高四位低四位的,求解

Python:如何将 32 位有符号长整数转换为 7 位整数

python身份证号换成***

navicat for mysql 64位和32位区别,win7 64位下用32位和64位有区别吗??

将 PCM 16 位音频转换为 PCM 8 位