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

Python: How to Convert 32-bit Signed Long to 7-bit ints

为了通过 Firmata/serial link 将 32 位有符号长整数转换为 7 位整数,最好的方法是什么(在 Python 中)?转成8位没问题,(long_val).to_bytes(4, 'little')就可以了。最后的序列应该是这样的:

No 1, bits 0-6
No 2, bits 7-13
No 3, bits 14-20
No 4, bits 21-27
No 5, bits 28-32

从 5 项 7 位整数序列向后转换为 32 位有符号长整数也很有帮助。

s = bin(pos)[2:].zfill(32)
cmd = bytearray([acc.ACCELSTEPPER_TO, dev_no,
int(s[28:32], 2), int(s[21:28], 2), int(s[14:21], 2),
int(s[7:14], 2), int(s[0:7], 2)])
brd.send_sysex(acc.ACCELSTEPPER_DATA, cmd)

不幸的是我的方法产生了错误的结果,所以我想完全放弃它们并从头开始。 提前感谢您的任何建议。

它本身不完全是 7 位,但听起来像是 base64 coding 的工作。如果您只需要通过 7 位通道传输数据,那么 base64 应该可以很好地工作。当然,您的数据流会稍微长一些,即 6 个字节而不是 5 个。

以下是您在 Python 中的写法:

import base64

def encode_number(n):
    """Takes an int and returns a bytes object in base64 encoding."""
    return base64.b64encode(n.to_bytes(4, byteorder='little'))

def decode_number(b):
    """Takes a bytes object in base64 encoding and returns an int."""
    return int.from_bytes(base64.b64decode(b), byteorder='little')

如果您需要超过 32 位的数字,只需在此处更改第 5 行中的 4

只需一次转换 7 位:

bytes = []
for i in range(5):
    bytes.append(long_value & 0x7f)
    long_value >>= 7
long_value = 0
for i in reversed(range(5)):
    long_value <<= 7
    long_value |= bytes[i]